deep dive reactive java (devoxxpl)

19
TOMASZ KOWALCZEWSKI SFBDUJWF! KBWB

Upload: tomasz-kowalczewski

Post on 07-Aug-2015

168 views

Category:

Software


1 download

TRANSCRIPT

T O M A S Z K O W A L C Z E W S K I

Agenda

• A little bit of history

• Challenges before us

• A few words about API

• Code!

Reactive, asynchronous• People have been doing it for years

• (Re)invented time and again by big companies and/or in high performance products

–Donald Knuth

“The idea that people knew a thing or two in the 70s is strange to a lot of young programmers”

Reactive, asynchronous• People have been doing it for years

• (Re)invented time and again by big companies and/or in high performance products

• Now every company may need to operate at that scale

• As users demand more and faster we need tools to do it right

It started in Microsoft

Brought to you by Erik Meijer & co.

Synchronous pull communication

Client Server

Request

Response

Processing

Network latency

Asynchronous push

Processing

Network latency

Asynchronous push

t

subscribe

onNext*

onCompleted | onError

unsubscribe

Synchronous designList<String> tweets = client.getNextTweets(); List<Tweet> validTweets = Lists.newArrayList();

for (String jsonTweet : tweets) { Tweet tweet = gson.fromJson(jsonTweet, Tweet.class);

Image image; image = download(tweet.getUser().getProfileImage()); Tweet.setImage(image); if (tweet.isValidTweet()) {

validTweets.add(tweet); } }

Decomposing individual operations

List<String> tweets = client.getNextTweets(); List<Tweet> validTweets = Lists.newArrayList();

for (String jsonTweet : tweets) { Tweet tweet = gson.fromJson(jsonTweet, Tweet.class);

Image image; image = download(tweet.getUser().getProfileImage()); Tweet.setImage(image); if (tweet.isValidTweet()) {

validTweets.add(tweet); } }

Decomposing individual operations

List<String> tweets = client.getNextTweets(); List<Tweet> validTweets = Lists.newArrayList();

for (String jsonTweet : tweets) { Tweet tweet = gson.fromJson(jsonTweet, Tweet.class);

Image image; image = download(tweet.getUser().getProfileImage()); Tweet.setImage(image); if (tweet.isValidTweet()) {

validTweets.add(tweet); } }

Decomposing individual operations

List<String> tweets = client.getNextTweets(); List<Tweet> validTweets = Lists.newArrayList();

for (String jsonTweet : tweets) { Tweet tweet = gson.fromJson(jsonTweet, Tweet.class);

Image image; image = download(tweet.getUser().getProfileImage()); Tweet.setImage(image); if (tweet.isValidTweet()) {

validTweets.add(tweet); } }

Decomposing individual operations

List<String> tweets = client.getNextTweets(); List<Tweet> validTweets = Lists.newArrayList();

for (String jsonTweet : tweets) { Tweet tweet = gson.fromJson(jsonTweet, Tweet.class);

Image image; image = download(tweet.getUser().getProfileImage()); Tweet.setImage(image); if (tweet.isValidTweet()) {

validTweets.add(tweet); } }

What is missing?List<String> tweets = client.getNextTweets(); List<Tweet> validTweets = Lists.newArrayList();

for (String jsonTweet : tweets) { Tweet tweet = gson.fromJson(jsonTweet, Tweet.class);

Image image; image = download(tweet.getUser().getProfileImage()); Tweet.setImage(image); if (tweet.isValidTweet()) {

validTweets.add(tweet); } }

Error

hand

ling

Timeouts

Monitoring

Logging

Back pressure

Parallelism

Available in a language orframework near you

source: flatmapthatshit.com

Credits

• Cat picture taken from http://www.teckler.com/en/Rapunzel