Slide 1

Slide 1 text

@TwitterAds | Confidential Evan Meagher (@evanm) 7/28/14 Netty at Twitter with Finagle

Slide 2

Slide 2 text

@Twitter 2 Agenda Why and what is Finagle? What does it do? What are we working on now?

Slide 3

Slide 3 text

@Twitter 3 What is Finagle?

Slide 4

Slide 4 text

@Twitter 4 An open source, protocol-agnostic, asynchronous RPC library for the JVM

Slide 5

Slide 5 text

@Twitter 5 Why did we build Finagle?

Slide 6

Slide 6 text

@Twitter 6 In the beginning…

Slide 7

Slide 7 text

@Twitter 7 Monolithic Rails app MySQL

Slide 8

Slide 8 text

@Twitter 8 Monolithic Rails app MySQL Monolithic Rails app MySQL Monolithic Rails app MySQL … Monolithic Rails app MySQL … …

Slide 9

Slide 9 text

@Twitter 9

Slide 10

Slide 10 text

@Twitter 10

Slide 11

Slide 11 text

@Twitter 11 What is Finagle?

Slide 12

Slide 12 text

@Twitter 12 An open source, protocol-agnostic, asynchronous RPC library for the JVM

Slide 13

Slide 13 text

@Twitter 13 An open source, protocol-agnostic, asynchronous RPC library for the JVM

Slide 14

Slide 14 text

@Twitter 14 An open source, protocol-agnostic, asynchronous RPC library for the JVM

Slide 15

Slide 15 text

@Twitter 15 An open source, protocol-agnostic, asynchronous RPC library for the JVM

Slide 16

Slide 16 text

@Twitter 16 An open source, protocol-agnostic, asynchronous RPC library for the JVM

Slide 17

Slide 17 text

@Twitter 17 What does Finagle do?

Slide 18

Slide 18 text

@Twitter 18 Standardizes the edges in a “boxes and arrows” network diagram

Slide 19

Slide 19 text

@Twitter 19 [1] http://monkey.org/~marius/funsrv.pdf

Slide 20

Slide 20 text

@Twitter 20 type Service[Req, Rep] = Req => Future[Rep]

Slide 21

Slide 21 text

@Twitter 21 type Service[Req, Rep] = Req => Future[Rep] Server Client Req Future[Rep]

Slide 22

Slide 22 text

@Twitter 22 A contrived example

Slide 23

Slide 23 text

@Twitter 23 val server = new Service[HttpReq, HttpRep] { def apply(req: HttpReq): Future[HttpRep] = Future.value(HttpRep(Status.OK, req.body)) } ! Http.serve(":80", server)

Slide 24

Slide 24 text

@Twitter 24 val client: Service[HttpReq, HttpRep] = Http.newService(“twitter.com:80") ! val futureResponse: Future[HttpRep] = client(HttpReq(“/")) ! futureResponse map { response => println(response) }

Slide 25

Slide 25 text

@Twitter 25 Now let’s say you need to authenticate requests

Slide 26

Slide 26 text

@Twitter 26 type Service[Req, Rep] = Req => Future[Rep] ! type Filter[Req, Rep] = (Req, Service[Req, Rep]) => Future[Rep]

Slide 27

Slide 27 text

@Twitter 27 type Service[Req, Rep] = Req => Future[Rep] ! type Filter[Req, Rep] = (Req, Service[Req, Rep]) => Future[Rep] Filter Filter Server Client

Slide 28

Slide 28 text

@Twitter 28 def isAuthed(req: Req): Boolean val authFilter: Filter[HttpReq, HttpRes] = { (req, svc) => if (isAuthed(req)) svc(req) else Future.exception(new AccessDenied) } ! val authedServer: Service[HttpReq, HttpRes] = authFilter andThen server

Slide 29

Slide 29 text

@Twitter 29 val instrumentedServer = authFilter andThen traceRequest andThen recordStats andThen server

Slide 30

Slide 30 text

@Twitter 30 What are we working on now?

Slide 31

Slide 31 text

@Twitter 31 Service discovery See the “Names” page on the Finagle user guide: http://twitter.github.io/finagle/guide/Names.html ! val client = Http.newService( “zk!myzkhost.mycompany.com:2181!/my/zk/path” )

Slide 32

Slide 32 text

@Twitter 32 Load balancing

Slide 33

Slide 33 text

@Twitter 33 Request multiplexing See the “Protocols” page on the Finagle user guide: http://twitter.github.io/finagle/guide/Protocols.html

Slide 34

Slide 34 text

@Twitter 34 Tail-latency optimization

Slide 35

Slide 35 text

@TwitterAds | Confidential Thanks! github.com/twitter/finagle @finagle @evanm