40
APACHE SLING & FRIENDS TECH MEETUP BERLIN, 22-24 SEPTEMBER 2014 OSGi Asynchronous Services: more than RPC Michael Dürig, Adobe Research

OSGi Asynchronous Services: more than RPC

Embed Size (px)

DESCRIPTION

The Asynchronous Services Specification of the OSGi Alliance is an effort to better support parallelism on the OSGi platform. While it allows services to be called asynchronously it is more that just another RPC mechanism. This sessions shows how to use Asynchronous Services to structure highly concurrent programs for maximised resource utilisation and throughput and how this approach results in less blocking and lock contention. While not entirely new, the approach shown resembles a shift in paradigms in the sense that explicit thread management moves from client code to the environment much like it had happened for explicit memory management in the 90ies.

Citation preview

Page 1: OSGi Asynchronous Services: more than RPC

APACHE SLING & FRIENDS TECH MEETUPBERLIN, 22-24 SEPTEMBER 2014

OSGi Asynchronous Services: more than RPCMichael Dürig, Adobe Research

Page 2: OSGi Asynchronous Services: more than RPC

Some typical code

socket.getInputStream().read(buffer);

Page 3: OSGi Asynchronous Services: more than RPC

Timings on typical hardware...

Execute CPU instruction 1nsFetch from L2 cache 7 nsFetch from memory 100 nsRead from disk 8 msNetwork round-trip Europe-US 150 ms

source: http://norvig.com/21-days.html#answers

Page 4: OSGi Asynchronous Services: more than RPC

...in human terms

Execute CPU instruction 1 sFetch from L2 cache 7 sFetch from memory 1.6 minRead from disk 13.2 weeksNetwork round-trip Europe-US 4.8 years

source: http://norvig.com/21-days.html#answers

Page 5: OSGi Asynchronous Services: more than RPC

Outline

OSGi RFC 206: Asynchronous Services Promise Example

Page 6: OSGi Asynchronous Services: more than RPC

Goals

Improve resource utilisation Parallelism Non blocking IO

Automatic thread management Runtime vs. hard coded

Page 7: OSGi Asynchronous Services: more than RPC

OSGi RFC 206: Asynchronous Services

Asynchronous method calls Return Promise<T> instead of T Direct implementations Mediation through Async

Page 8: OSGi Asynchronous Services: more than RPC

Mediating a service

Async async = ...ServiceReference<Weather> ref = ...

Weather weather = async.mediate(ref, Weather.class);Promise<Boolean> sunnyPromise = async.call(weather.isSunny());

Page 9: OSGi Asynchronous Services: more than RPC

Promise<T>?

Page 10: OSGi Asynchronous Services: more than RPC

Promise

Encapsulation of a value that maybe available at some later time can be read multiple times immutable once resolved

Page 11: OSGi Asynchronous Services: more than RPC

Promise callback

sunnyPromise.then(...

Page 12: OSGi Asynchronous Services: more than RPC

Promise callback: success

weather.isSunny().then( success -> { if (success.getValue()) { println("Sun fun and nothing to do"); } else { println("Singing in the rain"); }},

...

Page 13: OSGi Asynchronous Services: more than RPC

Promise callback: failure

weather.isSunny().then( success -> { if (success.getValue()) { println("Sun fun and nothing to do"); } else { println("Singing in the rain"); }}, failure -> { failure.getFailure().printStackTrace();});

Page 14: OSGi Asynchronous Services: more than RPC

Effects

Promises capture the effects of latency: when the call back happens error: which call back happens

Page 15: OSGi Asynchronous Services: more than RPC

Promise<T>!

Page 16: OSGi Asynchronous Services: more than RPC

Vendor Service

interface Vendor { Promise<Offer> getOffer(String item);}

class Offer { public Offer(Vendor vendor, String item, double price, String currency) { ...

Page 17: OSGi Asynchronous Services: more than RPC

Exchange Service

Promise<Offer> convertToEuro1(Offer offer);

Promise<Offer> convertToEuro2(Offer offer);

Page 18: OSGi Asynchronous Services: more than RPC

Goals

Get offer from vendor Convert to € with recovery Fail gracefully Non blocking!

Page 19: OSGi Asynchronous Services: more than RPC

getOffer...

Promise<Offer> getOffer(Vendor vendor, String item) { return vendor .getOffer(item);}

Page 20: OSGi Asynchronous Services: more than RPC

flatMap

Promise<R> flatMap(T -> Promise<R>)

Page 21: OSGi Asynchronous Services: more than RPC

flatMap

Promise<R> flatMap(Offer -> Promise<R>)

Page 22: OSGi Asynchronous Services: more than RPC

flatMap

Promise<Offer> flatMap(Offer -> Promise<Offer>)

Page 23: OSGi Asynchronous Services: more than RPC

flatMap

Promise<Offer> flatMap(Offer -> Promise<Offer>)

Promise<Offer> convertToEuro1(Offer);

Page 24: OSGi Asynchronous Services: more than RPC

getOffer: convert to €

Promise<Offer> getOffer(Vendor vendor, String item) { return vendor .getOffer(item) .flatMap(offer -> convertToEuro1(offer));}

Page 25: OSGi Asynchronous Services: more than RPC

recoverWith

Promise<R> recoverWith(Promise<?> -> Promise<R>)

Page 26: OSGi Asynchronous Services: more than RPC

recoverWith

Promise<Offer> recoverWith(Promise<?> -> Promise<Offer>)

Page 27: OSGi Asynchronous Services: more than RPC

recoverWith

Promise<Offer> recoverWith(Promise<?> -> Promise<Offer>)

Promise<Offer> convertToEuro2(Offer);

Page 28: OSGi Asynchronous Services: more than RPC

getOffer: fallback

Promise<Offer> getOffer(Vendor vendor, String item) { return vendor .getOffer(item) .flatMap(offer -> convertToEuro1(offer) .recoverWith(failed -> convertToEuro2(offer)));}

Page 29: OSGi Asynchronous Services: more than RPC

recover

Promise<R> recover(Promise<?> -> R)

Page 30: OSGi Asynchronous Services: more than RPC

recover

Promise<Offer> recover(Promise<?> -> Offer)

Page 31: OSGi Asynchronous Services: more than RPC

getOffer: fail gracefully

Promise<Offer> getOffer(Vendor vendor, String item) { return vendor .getOffer(item) .flatMap(offer -> convertToEuro1(offer) .recoverWith(failed -> convertToEuro2(offer)) .recover(failed -> Offer.NONE));}

Page 32: OSGi Asynchronous Services: more than RPC

Non blocking

Act on Promise<T> instead of T

Page 33: OSGi Asynchronous Services: more than RPC

Demo

Page 34: OSGi Asynchronous Services: more than RPC

Summary

Promises capture latency and error Non blocking Focus on main path

Decouple parallelisation Better resource utilisation Application scalability

Page 35: OSGi Asynchronous Services: more than RPC

Resources

http://goo.gl/pB9fza

Page 36: OSGi Asynchronous Services: more than RPC

Appendix

Page 37: OSGi Asynchronous Services: more than RPC

Deferred

Encapsulation of a value that should be made available at some later time can be written once immutable once resolved

Page 38: OSGi Asynchronous Services: more than RPC

What about j.u.concurrent.Future?

Blocking semantics No callbacks

Not composable No map/flatMap/filter/...

Page 39: OSGi Asynchronous Services: more than RPC

Resources

Support material: https://github.com/mduerig/async-support/wiki Session slides Runnable demo Links to further reading

RFC 206: https://github.com/osgi/design/tree/master/rfcs/rfc0206 Public draft of OSGi RFC 206: Asynchronous Services

OSGi Alliance: http://www.osgi.org/

Page 40: OSGi Asynchronous Services: more than RPC

Resources

RxJava: https://github.com/ReactiveX/RxJava Observables: taking Promises one step further

Akka: http://akka.io/ Toolkit for concurrent and distributed applications on the JVM