@samklr #devoxx #finagle #scala RPC Redux • Control of clients and servers • Need for predictable performance • Communication between different languages • Isolated computations • Fan out, Fan In distributed systems • ...
@samklr #devoxx #finagle #scala Futures • Concurrency primitive in Finagle • Different from scala.concurrent.Future and java.util.concurrent. Future • Less context-switching, easier cancelability • From com.twitter.util.Future • Composables • Error and Exception Handling
@samklr #devoxx #finagle #scala Filters val myTimeoutFilter = new TimeoutFilter[String, Int](1.second,DefaultTimer.twitter) val myService = new DummyService
@samklr #devoxx #finagle #scala Filters val myTimeoutFilter = new TimeoutFilter[String, Int](1.second,DefaultTimer.twitter) val myService = new DummyService val server = myTimeOutFilter andThen myService
@samklr #devoxx #finagle #scala Filters val myTimeoutFilter = new TimeoutFilter[String,Int]( 1.second, DefaultTimer.twitter) val myService = new DummyService val service = myService andThen myTimeOutFilter val server = Httpx.serve( “:8080”, service) Await.ready(server)
@samklr #devoxx #finagle #scala Clients Finagle client are just full stack services val myClient: Service[Request, Response] = Httpx.newService("rtb-bidder.com:8081") val bidder = Httpx.serve(":8080", myClient)
@samklr #devoxx #finagle #scala Finagle Mux • RPC Protocol Multiplexing • One network connection per client-server session • Maximization of available bandwidth without incurring the cost of opening additional sockets • Elimination of head-of-line blocking • Explicit queue management • Pure session layer (OSI )
@samklr #devoxx #finagle #scala Service discovery ● Finagle ServerSets via ”Names” ● Uses Zookeeper as Name server val client = Http.newService( “zk!myzkhost.home.com:2181!/my/zk/path” )
@samklr #devoxx #finagle #scala Twitter-Server • Template for servers at Twitter built on top of Finagle • Flags for configuration • Logging and Metrics • Admin HTTP UI • Lifecycle management endpoints, handy for Docker and/or Mesos • Tracing via ZipKin
@samklr #devoxx #finagle #scala Finatra • Library to easily build API Services on top of the Twitter Stack (Finagle, Twitter-Server, Twitter-util, etc.) • Supports Http and Thrift services • Brings Sinatra like Style to Finagle for Rest Services
@samklr #devoxx #finagle #scala ● Thin layer of purely functional basic blocks, to build composable REST APIs. ● Built on top of Finagle ● Functional wrapper of Finagle-http ● Performance close to Bare Metal Finagle http://github.com/finagle/finch
@samklr #devoxx #finagle #scala Zipkin • Zipkin is a distributed tracing system that helps us gather timing data for all the disparate services at Twitter. It manages both the collection and lookup of this data through a Collector and a Query service. • Implementation of Google’s Dapper paper • Moved to OpenZipkin
@samklr #devoxx #finagle #scala Finagle : Cons • Stuck to old versions of Netty. Currently Netty 3 and now moving to 4 • API Changes since 6.x. No more Netty API Leaking through Finagle’s • Mismatch between scala.concurrent.Future and com.twitter.util.Future • Slow to update • Documentation not exhaustive. Thanks for gitter.im and the Mailing List • Can be painful to plug to other Metrics and Monitoring systems. Hopefully it’s changing