SlideShare a Scribd company logo
1 of 44
⇨ Asy Ronen (A.K.A Async) 
⇨ Eran Harel (@eran_ha)
Before OB1K... 
● Multitenancy on a single Tomcat JVM 
● Our API hosts actually executed 8 modules 
on a single JVM
Before OB1K... 
● Applicative logs clutter 
● Monitoring clutter
Before OB1K... 
● Hard to troubleshoot performance issues 
● Hard to fine tune JVMs 
● Shared configuration
Before OB1K... 
● Deployments means start / stop for several 
modules 
● Sub optimal for CD environment...
Before OB1K... 
● The container (Tomcat) was installed by 
Chef, and had a different life cycle then the 
web-modules 
● Container upgrades were a nightmare
What is OB1K?
Asynchronous IO based on Netty
Synchronous Modules based on Jetty 9
Drop-in replacement for Tomcat 
apps
Kick A$$ Performance :)
Self Contained
Isolated Services 
● Own JVM 
● Own JVM settings 
● Own configuration 
● Own port 
● Own logs directory 
● Own log configuration
Full control over your module 
● JVM options 
● Configuration properties 
● Logging 
● Ports 
● Compression 
● Threads 
● SSL 
● Etc
Seamless RPC 
● Strongly Typed RPC Client
Seamless RPC 
● RPC complexity is transparent to the client
Seamless RPC 
● Server implementation only worries about 
the business logic
Seamless RPC 
● Configurable client behavior (e.g. retries)
Seamless RPC 
● Built-In serialization support 
o MsgPack 
o JSON 
o Compression
HTTP Streams
Configuration as code
Free Standard API entry points 
● /selftest 
● /version 
● /help (/) 
● /properties 
● /ping 
● /presence 
● /jmx 
● /tailLog 
● /endPoints
Free Service Monitoring
Service Discovery Integration
Easier upgrades, easier deployment
Same execution path for 
Dev / Prod / JUnit
Maven Archetype Scaffolding 
$ mvn archetype:generate -DarchetypeGroupId=com.outbrain - 
DarchetypeArtifactId=outbrain-ob1k-archetype -DarchetypeVersion=1.0.18 - 
DinteractiveMode=false -Dversion=trunk -DgroupId=com.outbrain - 
Dpackage=com.outbrain.YOUR_PACKAGE_NAME -DartifactId=YOUR_SERVICE_NAME
A set of asynchronous modules 
● Async memcached client 
● Async RPC client 
● Async HTTP client 
● Async DB query execution 
● Async Cassandra client 
● Async Event Stream support 
● Composable Futures infrastructure
General Flow
The main class
Jetty Server 
public class GruffaloServer { 
private static final Logger logger = LoggerFactory.getLogger(GruffaloServer.class); 
public static void main(String[] args) { 
new GruffaloServer().build().start(); 
logger.info("******** Gruffalo started ********"); 
} 
public Server build() { 
return new JettyServerBuilder().useConfigurationPorts().setContextPath("/Gruffalo"); 
}}
Netty Server 
public static Server buildServer() { 
final String contextPath = "/Ob1kTemplate"; 
Context ctx = new SpringContextBuilder(contextPath). 
addInitParam("self-tests", "properties,zookeeper,url,valid-context"). 
setMainContext("main", "classpath:applicationContext-Ob1kTemplate-all.xml"). 
addSubContext("ops", "classpath:WEB-INF/spring/ops-services.xml"). 
addSubContext("service", "classpath:WEB-INF/spring/Ob1kTemplate-service.xml"). 
build(); 
ServerBuilder serverBuilder = new ServerBuilder(). 
setContextPath(contextPath). 
setContext(ctx). 
addStaticPath("/html"). 
addStaticPath("/css"). 
addBaseServices("ops"). 
addServiceFromContext("service", Ob1kService.class, "/api"). 
createServiceFromContext("service", Ob1kNamedService.class, "/names"). 
addEndpoint("handleFirstRequest", "/first/{id}"). 
addEndpoint("handleSecondRequest", "/second/{name}"). 
addEndpoint("handleThirdRequest", "/third/{state}/{city}"). 
addService().useConfigurationPorts(); 
return serverBuilder.build(); 
}
OB1K Service 
public class Ob1kService implements Service { 
private static final Logger log = LoggerFactory.getLogger(Ob1kService.class); 
private final String greetingMessage; 
public Ob1kService(final String greetingMessage) { 
this.greetingMessage = greetingMessage; 
} 
public ComposableFuture<String> echo(final String name) { 
return ComposableFutures.fromValue("hello " + name + ". " + greetingMessage); 
}}
OB1K client 
new ClientBuilder<>(IOb1kService.class). 
setProtocol(ContentType.JSON). 
setRequestTimeout(requestTimeout). 
setRetries(retries). 
addEndpoint("http://somehost:8080/Ob1kApp/Ob1kService"). 
build();
ComposableFuture 
public interface ComposableFuture<T> extends Future<T> { 
<R> ComposableFuture<R> continueWith(final ResultHandler<T, R> handler); 
<R> ComposableFuture<R> continueOnSuccess(final SuccessHandler<? super T, ? 
extends R> handler); 
ComposableFuture<T> continueOnError(final ErrorHandler<? extends T> handler); 
void onResult(OnResultHandler<T> handler); 
void onSuccess(OnSuccessHandler<? super T> handler); 
void onError(OnErrorHandler handler); 
ComposableFuture<T> withTimeout(long duration, final TimeUnit unit);}
ComposableFuture Example 
ComposableFuture<Response> f1 = client.httpGet("http://www.google.co.il/search?q=term1"); 
ComposableFuture<Response> f2 = client.httpGet("http://www.google.co.il/search?q=term2"); 
ComposableFuture<Response> f3 = client.httpGet("http://www.google.co.il/search?q=term3"); 
ComposableFuture<List<Response>> combined = all(f1, f2, f3); 
ComposableFuture<String> res = combined.continueWith((result) -> { 
// prepare combined result.}); 
schedule(() -> { 
return trySomething().continueOnError((error) -> { 
return getFallback(); 
}); 
}, 30, TimeUnit.SECONDS);
How does it all works ? 
● All IO is non blocking and done via Netty 
● Basically one thread per core, all working 
unless there is nothing to do 
● Context switch is minimized 
● Transport is always HTTP, payload may vary 
● Adjusted Executor for blocking actions(if you 
must)
Why Streams ? 
● Time to serve is limited, better to serve results as 
they come 
● A stream of results is, well… a stream 
● Request/response model is not a good fit for all 
scenarios, thing twitter streaming API 
● Streams can be combined in all sorts of wonderful 
ways 
● Implementation uses RxJava 
● Ask netflix :)
What is the catch? 
● Blocking code is (almost)forbidden in the 
async mode 
● Writing asynchronous code has a learning 
curve 
● Libraries have to be adapted
Alternatives 
Finagle 
Drop Wizard 
Vert.x 
Play Framework 
RESTEasy 
Etc
Future Features 
● Client Side Load Balancing 
● Client Side Discovery (Consul based) 
● Aggregation 
● Scatter-Gather 
● Throttling 
● Session Tracing (a-la Zipkin)
Ob1k presentation at Java.IL

More Related Content

What's hot

What's hot (20)

NodeJs
NodeJsNodeJs
NodeJs
 
Reactive programming with examples
Reactive programming with examplesReactive programming with examples
Reactive programming with examples
 
Real world functional reactive programming
Real world functional reactive programmingReal world functional reactive programming
Real world functional reactive programming
 
Reactive Java (GeeCON 2014)
Reactive Java (GeeCON 2014)Reactive Java (GeeCON 2014)
Reactive Java (GeeCON 2014)
 
The Road To Reactive with RxJava JEEConf 2016
The Road To Reactive with RxJava JEEConf 2016The Road To Reactive with RxJava JEEConf 2016
The Road To Reactive with RxJava JEEConf 2016
 
JMC/JFR: Kotlin spezial
JMC/JFR: Kotlin spezialJMC/JFR: Kotlin spezial
JMC/JFR: Kotlin spezial
 
Building Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaBuilding Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJava
 
Service discovery like a pro (presented at reversimX)
Service discovery like a pro (presented at reversimX)Service discovery like a pro (presented at reversimX)
Service discovery like a pro (presented at reversimX)
 
Reactive Java (33rd Degree)
Reactive Java (33rd Degree)Reactive Java (33rd Degree)
Reactive Java (33rd Degree)
 
Callbacks and control flow in Node js
Callbacks and control flow in Node jsCallbacks and control flow in Node js
Callbacks and control flow in Node js
 
How NOT to write in Node.js
How NOT to write in Node.jsHow NOT to write in Node.js
How NOT to write in Node.js
 
Kotlin Coroutines and Rx
Kotlin Coroutines and RxKotlin Coroutines and Rx
Kotlin Coroutines and Rx
 
Non Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJavaNon Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJava
 
Reactive Programming on Android - RxAndroid - RxJava
Reactive Programming on Android - RxAndroid - RxJavaReactive Programming on Android - RxAndroid - RxJava
Reactive Programming on Android - RxAndroid - RxJava
 
Ratpack JVM_MX Meetup February 2016
Ratpack JVM_MX Meetup February 2016Ratpack JVM_MX Meetup February 2016
Ratpack JVM_MX Meetup February 2016
 
Structured concurrency with Kotlin Coroutines
Structured concurrency with Kotlin CoroutinesStructured concurrency with Kotlin Coroutines
Structured concurrency with Kotlin Coroutines
 
Servlet Async I/O Proposal (NIO.2)
Servlet Async I/O Proposal (NIO.2)Servlet Async I/O Proposal (NIO.2)
Servlet Async I/O Proposal (NIO.2)
 
Reactive programming with Rxjava
Reactive programming with RxjavaReactive programming with Rxjava
Reactive programming with Rxjava
 
Intro to RxJava/RxAndroid - GDG Munich Android
Intro to RxJava/RxAndroid - GDG Munich AndroidIntro to RxJava/RxAndroid - GDG Munich Android
Intro to RxJava/RxAndroid - GDG Munich Android
 
Scalable Web Apps
Scalable Web AppsScalable Web Apps
Scalable Web Apps
 

Viewers also liked

Enterprise(d) Tomcat & httpd
Enterprise(d) Tomcat & httpdEnterprise(d) Tomcat & httpd
Enterprise(d) Tomcat & httpd
Vaclav Tunka
 
Multithreading, Blocking IO and Async IO
Multithreading, Blocking IO and Async IOMultithreading, Blocking IO and Async IO
Multithreading, Blocking IO and Async IO
Directi Group
 
Netty 4-based RPC System Development
Netty 4-based RPC System DevelopmentNetty 4-based RPC System Development
Netty 4-based RPC System Development
Allan Huang
 

Viewers also liked (14)

Introduction tomcat7 servlet3
Introduction tomcat7 servlet3Introduction tomcat7 servlet3
Introduction tomcat7 servlet3
 
Enterprise(d) Tomcat & httpd
Enterprise(d) Tomcat & httpdEnterprise(d) Tomcat & httpd
Enterprise(d) Tomcat & httpd
 
Websockets on the JVM: Atmosphere to the rescue!
Websockets on the JVM: Atmosphere to the rescue!Websockets on the JVM: Atmosphere to the rescue!
Websockets on the JVM: Atmosphere to the rescue!
 
Multithreading, Blocking IO and Async IO
Multithreading, Blocking IO and Async IOMultithreading, Blocking IO and Async IO
Multithreading, Blocking IO and Async IO
 
Asynchronous design with Spring and RTI: 1M events per second
Asynchronous design with Spring and RTI: 1M events per secondAsynchronous design with Spring and RTI: 1M events per second
Asynchronous design with Spring and RTI: 1M events per second
 
Fastest Servlets in the West
Fastest Servlets in the WestFastest Servlets in the West
Fastest Servlets in the West
 
Async IO and Multithreading explained
Async IO and Multithreading explainedAsync IO and Multithreading explained
Async IO and Multithreading explained
 
Knowledge Sharing : Java Servlet
Knowledge Sharing : Java ServletKnowledge Sharing : Java Servlet
Knowledge Sharing : Java Servlet
 
Auxiliary : Tomcat
Auxiliary : TomcatAuxiliary : Tomcat
Auxiliary : Tomcat
 
Async servlets
Async servletsAsync servlets
Async servlets
 
Introduction to Apache Tomcat 7 Presentation
Introduction to Apache Tomcat 7 PresentationIntroduction to Apache Tomcat 7 Presentation
Introduction to Apache Tomcat 7 Presentation
 
NetflixOSS season 2 episode 2 - Reactive / Async
NetflixOSS   season 2 episode 2 - Reactive / AsyncNetflixOSS   season 2 episode 2 - Reactive / Async
NetflixOSS season 2 episode 2 - Reactive / Async
 
MicroServices at Netflix - challenges of scale
MicroServices at Netflix - challenges of scaleMicroServices at Netflix - challenges of scale
MicroServices at Netflix - challenges of scale
 
Netty 4-based RPC System Development
Netty 4-based RPC System DevelopmentNetty 4-based RPC System Development
Netty 4-based RPC System Development
 

Similar to Ob1k presentation at Java.IL

Similar to Ob1k presentation at Java.IL (20)

Native Java with GraalVM
Native Java with GraalVMNative Java with GraalVM
Native Java with GraalVM
 
Apache httpd reverse proxy and Tomcat
Apache httpd reverse proxy and TomcatApache httpd reverse proxy and Tomcat
Apache httpd reverse proxy and Tomcat
 
Adopting GraalVM - Scale by the Bay 2018
Adopting GraalVM - Scale by the Bay 2018Adopting GraalVM - Scale by the Bay 2018
Adopting GraalVM - Scale by the Bay 2018
 
It gilde 20150209
It gilde 20150209It gilde 20150209
It gilde 20150209
 
Cli jbug
Cli jbugCli jbug
Cli jbug
 
AS7 and CLI
AS7 and CLIAS7 and CLI
AS7 and CLI
 
Dragoncraft Architectural Overview
Dragoncraft Architectural OverviewDragoncraft Architectural Overview
Dragoncraft Architectural Overview
 
Introduction to ZooKeeper - TriHUG May 22, 2012
Introduction to ZooKeeper - TriHUG May 22, 2012Introduction to ZooKeeper - TriHUG May 22, 2012
Introduction to ZooKeeper - TriHUG May 22, 2012
 
Finagle and Java Service Framework at Pinterest
Finagle and Java Service Framework at PinterestFinagle and Java Service Framework at Pinterest
Finagle and Java Service Framework at Pinterest
 
TypeScript for Java Developers
TypeScript for Java DevelopersTypeScript for Java Developers
TypeScript for Java Developers
 
Developing Microservices with Apache Camel
Developing Microservices with Apache CamelDeveloping Microservices with Apache Camel
Developing Microservices with Apache Camel
 
Play Framework
Play FrameworkPlay Framework
Play Framework
 
202107 - Orion introduction - COSCUP
202107 - Orion introduction - COSCUP202107 - Orion introduction - COSCUP
202107 - Orion introduction - COSCUP
 
Import golang; struct microservice
Import golang; struct microserviceImport golang; struct microservice
Import golang; struct microservice
 
ClojureScript loves React, DomCode May 26 2015
ClojureScript loves React, DomCode May 26 2015ClojureScript loves React, DomCode May 26 2015
ClojureScript loves React, DomCode May 26 2015
 
Oracle High Availabiltity for application developers
Oracle High Availabiltity for application developersOracle High Availabiltity for application developers
Oracle High Availabiltity for application developers
 
Container Orchestration from Theory to Practice
Container Orchestration from Theory to PracticeContainer Orchestration from Theory to Practice
Container Orchestration from Theory to Practice
 
Curator intro
Curator introCurator intro
Curator intro
 
NetflixOSS Open House Lightning talks
NetflixOSS Open House Lightning talksNetflixOSS Open House Lightning talks
NetflixOSS Open House Lightning talks
 
introduction to node.js
introduction to node.jsintroduction to node.js
introduction to node.js
 

Recently uploaded

Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Medical / Health Care (+971588192166) Mifepristone and Misoprostol tablets 200mg
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
masabamasaba
 
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
masabamasaba
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
masabamasaba
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
shinachiaurasa2
 
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
chiefasafspells
 

Recently uploaded (20)

8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
 
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the Situation
 
WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
 
tonesoftg
tonesoftgtonesoftg
tonesoftg
 
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
 

Ob1k presentation at Java.IL

  • 1. ⇨ Asy Ronen (A.K.A Async) ⇨ Eran Harel (@eran_ha)
  • 2. Before OB1K... ● Multitenancy on a single Tomcat JVM ● Our API hosts actually executed 8 modules on a single JVM
  • 3. Before OB1K... ● Applicative logs clutter ● Monitoring clutter
  • 4. Before OB1K... ● Hard to troubleshoot performance issues ● Hard to fine tune JVMs ● Shared configuration
  • 5. Before OB1K... ● Deployments means start / stop for several modules ● Sub optimal for CD environment...
  • 6. Before OB1K... ● The container (Tomcat) was installed by Chef, and had a different life cycle then the web-modules ● Container upgrades were a nightmare
  • 10. Drop-in replacement for Tomcat apps
  • 12.
  • 14. Isolated Services ● Own JVM ● Own JVM settings ● Own configuration ● Own port ● Own logs directory ● Own log configuration
  • 15. Full control over your module ● JVM options ● Configuration properties ● Logging ● Ports ● Compression ● Threads ● SSL ● Etc
  • 16. Seamless RPC ● Strongly Typed RPC Client
  • 17. Seamless RPC ● RPC complexity is transparent to the client
  • 18. Seamless RPC ● Server implementation only worries about the business logic
  • 19. Seamless RPC ● Configurable client behavior (e.g. retries)
  • 20. Seamless RPC ● Built-In serialization support o MsgPack o JSON o Compression
  • 23. Free Standard API entry points ● /selftest ● /version ● /help (/) ● /properties ● /ping ● /presence ● /jmx ● /tailLog ● /endPoints
  • 27. Same execution path for Dev / Prod / JUnit
  • 28. Maven Archetype Scaffolding $ mvn archetype:generate -DarchetypeGroupId=com.outbrain - DarchetypeArtifactId=outbrain-ob1k-archetype -DarchetypeVersion=1.0.18 - DinteractiveMode=false -Dversion=trunk -DgroupId=com.outbrain - Dpackage=com.outbrain.YOUR_PACKAGE_NAME -DartifactId=YOUR_SERVICE_NAME
  • 29. A set of asynchronous modules ● Async memcached client ● Async RPC client ● Async HTTP client ● Async DB query execution ● Async Cassandra client ● Async Event Stream support ● Composable Futures infrastructure
  • 31.
  • 33. Jetty Server public class GruffaloServer { private static final Logger logger = LoggerFactory.getLogger(GruffaloServer.class); public static void main(String[] args) { new GruffaloServer().build().start(); logger.info("******** Gruffalo started ********"); } public Server build() { return new JettyServerBuilder().useConfigurationPorts().setContextPath("/Gruffalo"); }}
  • 34. Netty Server public static Server buildServer() { final String contextPath = "/Ob1kTemplate"; Context ctx = new SpringContextBuilder(contextPath). addInitParam("self-tests", "properties,zookeeper,url,valid-context"). setMainContext("main", "classpath:applicationContext-Ob1kTemplate-all.xml"). addSubContext("ops", "classpath:WEB-INF/spring/ops-services.xml"). addSubContext("service", "classpath:WEB-INF/spring/Ob1kTemplate-service.xml"). build(); ServerBuilder serverBuilder = new ServerBuilder(). setContextPath(contextPath). setContext(ctx). addStaticPath("/html"). addStaticPath("/css"). addBaseServices("ops"). addServiceFromContext("service", Ob1kService.class, "/api"). createServiceFromContext("service", Ob1kNamedService.class, "/names"). addEndpoint("handleFirstRequest", "/first/{id}"). addEndpoint("handleSecondRequest", "/second/{name}"). addEndpoint("handleThirdRequest", "/third/{state}/{city}"). addService().useConfigurationPorts(); return serverBuilder.build(); }
  • 35. OB1K Service public class Ob1kService implements Service { private static final Logger log = LoggerFactory.getLogger(Ob1kService.class); private final String greetingMessage; public Ob1kService(final String greetingMessage) { this.greetingMessage = greetingMessage; } public ComposableFuture<String> echo(final String name) { return ComposableFutures.fromValue("hello " + name + ". " + greetingMessage); }}
  • 36. OB1K client new ClientBuilder<>(IOb1kService.class). setProtocol(ContentType.JSON). setRequestTimeout(requestTimeout). setRetries(retries). addEndpoint("http://somehost:8080/Ob1kApp/Ob1kService"). build();
  • 37. ComposableFuture public interface ComposableFuture<T> extends Future<T> { <R> ComposableFuture<R> continueWith(final ResultHandler<T, R> handler); <R> ComposableFuture<R> continueOnSuccess(final SuccessHandler<? super T, ? extends R> handler); ComposableFuture<T> continueOnError(final ErrorHandler<? extends T> handler); void onResult(OnResultHandler<T> handler); void onSuccess(OnSuccessHandler<? super T> handler); void onError(OnErrorHandler handler); ComposableFuture<T> withTimeout(long duration, final TimeUnit unit);}
  • 38. ComposableFuture Example ComposableFuture<Response> f1 = client.httpGet("http://www.google.co.il/search?q=term1"); ComposableFuture<Response> f2 = client.httpGet("http://www.google.co.il/search?q=term2"); ComposableFuture<Response> f3 = client.httpGet("http://www.google.co.il/search?q=term3"); ComposableFuture<List<Response>> combined = all(f1, f2, f3); ComposableFuture<String> res = combined.continueWith((result) -> { // prepare combined result.}); schedule(() -> { return trySomething().continueOnError((error) -> { return getFallback(); }); }, 30, TimeUnit.SECONDS);
  • 39. How does it all works ? ● All IO is non blocking and done via Netty ● Basically one thread per core, all working unless there is nothing to do ● Context switch is minimized ● Transport is always HTTP, payload may vary ● Adjusted Executor for blocking actions(if you must)
  • 40. Why Streams ? ● Time to serve is limited, better to serve results as they come ● A stream of results is, well… a stream ● Request/response model is not a good fit for all scenarios, thing twitter streaming API ● Streams can be combined in all sorts of wonderful ways ● Implementation uses RxJava ● Ask netflix :)
  • 41. What is the catch? ● Blocking code is (almost)forbidden in the async mode ● Writing asynchronous code has a learning curve ● Libraries have to be adapted
  • 42. Alternatives Finagle Drop Wizard Vert.x Play Framework RESTEasy Etc
  • 43. Future Features ● Client Side Load Balancing ● Client Side Discovery (Consul based) ● Aggregation ● Scatter-Gather ● Throttling ● Session Tracing (a-la Zipkin)