Finagle Lightning Talk JPR 2014

Post on 14-Apr-2017

234 views 5 download

Transcript of Finagle Lightning Talk JPR 2014

Reactive SOA with Finagle

Finagle Protocol agnostic RPC framework From Twitter Async and non-blocking built on Netty

and Futures Scala and Java APIs

Services and Filters Servicetrait Service[Req, Rep] extends (Req => Future[Rep])

Filterabstract class Filter[-ReqIn, +RepOut, +ReqOut, -RepIn] extends ((ReqIn, Service[ReqOut, RepIn]) => Future[RepOut])

Compositionval retryWithTimeout = retryFilter andThen timeoutFilter andThen service

Rest + RPC

Combining services Services return Futures Service calls may need prior results Don’t wait for completion Futures have callbacks

onSuccess onFailure

Nested Callbacks

Future Composition

CombinatorsFuture[A] map { A => B } : Future[B]

Future[A] flatMap { A => Future[B] } : Future[B]

Example

User Serviceclass UserServiceImpl extends UserRpc.FutureIface { def getUser() = { val user = User(Some("Chris”),

Some("chris@chris.com")) Future.value(user) }}

Client (flatMap)val userfuture = userclient.getUser()val contentfuture = tenantclient.getTenant() flatMap { tenant => contentclient.getContent(tenant) } flatMap { content => userfuture flatMap { user => personalizeclient .personalizeContent(content, user) } }

Client (for-comprehension)val newcontentfuture = for { user <- userclient.getUser() tenant <- tenantclient.getTenant() content <- contentclient.getContent(tenant) personalized <- personalizeclient.personalizeContent(content, user)} yield personalized

contentfuture onSuccess { message => println("received content response: " + message.customtext.get) }