the JVM, used to construct high-concurrency servers.” “Most of Finagle’s code is protocol agnostic, simplifying the implementation of new protocols.” https://twitter.github.io/finagle/
development framework* • Provides code-generation for various languages • Very good finagle integration ➟ Describe your API in a language agnostic way * https://thrift.apache.org/static/files/thrift-20070401.pdf
“Systems boundaries are represented by asynchronous functions called services. They provide a symmetric and uniform API: the same abstraction represents both clients and servers.”
identify network locations. A name can be: case class Name.Bound(va: Var[Addr]) case class Name.Path(path: Path) Resolver.eval parses Strings into Names.
blocks atop of Finagle for building composable HTTP APIs. Its mission is to provide developers simple and robust HTTP primitives being as close as possible to the bare metal Finagle API.” https://github.com/finagle/finch
code • Generic and sharable API definition with Thrift • Hardcoded service paths in Zookeeper => static request routing • No way of sending request metadata
locations. case class Name.Path(path: Path) A logical path starting with / is interpreted with a Dtab. http://twitter.github.io/finagle/guide/Names.html
recursion! 2. Dtabs a applied bottom to top Append a new entry to override existing ones 3. Dtabs are applied per request Overrides are used for the entire request tree
information • Managed across Threads / Execution Contexts ( Futures, Future Pools, Timers ) and client/server boundaries • Not explicitly passed • Two types: Local and Broadcast
} UserContext.current.foreach { userContext => appLog.info(s"Getting mean for user ${userContext.userId}") } Access the context in a service Providing the context for a request
@vkostyukov • Finagle RPC Redux by @marius • Finagle Blog • Finagle at Soundcloud by @pcalcado • Soundcloud - Synchronous communication for microservices