SlideShare a Scribd company logo
Async servers and clients in 
Rest.li 
1
(Please read the speaker notes) 
2
What is this Rest.li thing 
you speak about? 
“Rest.li is an open source REST framework for building robust, 
scalable RESTful architectures using type-safe bindings and 
asynchronous, non-blocking I/O.” 
3
The Stack 
Rest.li Data and REST API 
D2 Dynamic Discovery and load balancing 
R2 Network communication 
4
What do you by mean 
by async? 
5
What do you mean by 
async (I/O)? 
6 
Request 1 
Request 2 
Blocked on I/O 
Time 
Sync Async 
Free CPU
Rest.li is async and non-blocking 
under the hood! 
7
Rest.li 
D2 
R2 
8
How is R2 async and 
non-blocking? 
• Netty based async client 
• Jetty based server – configuration change (link) needed to run 
the server in async mode 
Rest.li 
D2 
R2 
9
How is D2 async and 
non-blocking? 
• All communication with ZooKeeper uses the asynchronous 
APIs 
• ZooKeeper pushes data to clients in case of updates 
Rest.li 
D2 
R2 
10
How is Rest.li async 
and non-blocking? 
• Does not handle I/O 
• I/O is taken care of by R2 
• R2 is async and non-blocking! 
• Uses ParSeq when interacting with and delegating to 
application code. 
Rest.li 
D2 
R2 
11
Async Rest.li Servers 
12
Async Server 
Implementations 
• The Rest.li framework is async and non-blocking under the 
hood. 
• As a result of this, if you do any blocking work in your method 
implementation it can negatively impact your application 
throughput as threads are held up by your application which 
are needed by Rest.li. (if you are using Rest.li in async 
mode) 
13
Async Server 
Implementations - 
Options 
1. Callback based 
2. ParSeq based 
14
Async Server – Callback 
@RestMethod.Get 
public void get(final Long id, @CallbackParam final Callback<Greeting> 
callback) { 
String path = "/data/" + id; 
_zkClient.getData(path, false, new DataCallback() { 
public void processResult(int i, String s, Object o, byte[] b, Stat 
st) { 
if (b.length == 0) { 
callback.onError(new 
RestLiServiceException(HttpStatus.S_404_NOT_FOUND)); 
} 
else { 
callback.onSuccess(buildGreeting(b)); 
} 
} 
}, null); 
} 15
Async Server – 
Callback Signature 
@RestMethod.Get 
public void get(final Long id, @CallbackParam 
final Callback<Greeting> callback) 
com.linkedin.common.Callback 
16
Async Server – Filling 
out the callback 
_zkClient.getData(path, false, new DataCallback() { 
public void processResult(int i, String s, Object o, 
byte[] b, Stat st) { 
if (b.length == 0) { 
callback.onError(new 
RestLiServiceException(HttpStatus.S_404_NOT_FOUND)); 
} 
else { 
callback.onSuccess(buildGreeting(b)); 
} 
} 
}, null); 17
Async Server – Callback 
@RestMethod.Get 
public void get(final Long id, @CallbackParam final Callback<Greeting> 
callback) { 
String path = "/data/" + id; 
_zkClient.getData(path, false, new DataCallback() { 
public void processResult(int i, String s, Object o, byte[] b, Stat 
st) { 
if (b.length == 0) { 
callback.onError(new 
RestLiServiceException(HttpStatus.S_404_NOT_FOUND)); 
} 
else { 
callback.onSuccess(buildGreeting(b)); 
} 
} 
}, null); 
} 18
Async server - ParSeq 
19
Key ParSeq Concepts 
• Promise Fully async Java Future + listener mechanism. 
• Task Basic unit of work that is similar to Java Callable. 
Task<T> 
• Engine runs Tasks. 
• Context Used by a Task to run sub-Tasks. 
• Composition par and seq 
(link) 
20
Async Server – ParSeq 
@RestMethod.Get 
public Task<Greeting> get(final Long id) { 
final Task<FileData> fileDataTask = buildFileDataTask(); 
final Task<Greeting> mainTask = Tasks.callable("main", new 
Callable<Greeting>() { 
@Override 
public Greeting call() throws Exception { 
FileData fileData = fileDataTask.get(); 
return buildGreetingFromFileData(id, fileData); 
} 
}); 
return Tasks.seq(fileDataTask, mainTask); 
} 
21
Async Server – ParSeq 
signature 
@RestMethod.Get 
public Task<Greeting> get(final Long id) 
22
Async Server – ParSeq body 
final Task<FileData> fileDataTask = buildFileDataTask(); 
23
Async Server – ParSeq body 
final Task<Greeting> mainTask = Tasks.callable("main", new 
Callable<Greeting>() { 
@Override 
public Greeting call() throws Exception { 
FileData fileData = fileDataTask.get(); 
return buildGreetingFromFileData(id, fileData); 
} 
}); 
24
Async Server – 
assembling the Tasks 
return Tasks.seq(fileDataTask, mainTask); 
25 
fileDataTask mainTask
Async Server – ParSeq 
@RestMethod.Get 
public Task<Greeting> get(final Long id) { 
final Task<FileData> fileDataTask = buildFileDataTask(); 
final Task<Greeting> mainTask = Tasks.callable("main", new 
Callable<Greeting>() { 
@Override 
public Greeting call() throws Exception { 
FileData fileData = fileDataTask.get(); 
return buildGreetingFromFileData(id, fileData); 
} 
}); 
return Tasks.seq(fileDataTask, mainTask); 
} 
26
Async Server – ParSeq 
• Can use this approach to build complex call graphs and 
return the final Task. (more on this later). 
• Can use ParSeq tracing 
• No callback hell! 
27
Async Rest.li Clients 
28
Async Rest.li requests 
• RestClient is async and non-blocking under the hood – it 
uses ParSeq and Netty. 
• Applications can still block the thread if they block on the 
results of the Rest.li call! 
Response response = 
_restClient.sendRequest(BUILDER.get().id(1L).build()).get(); 
Fortune fortune = response.getEntity(); 
Blocking on the result of a Future 
29
Async Rest.li requests 
Two Options: 
1. Callback based API 
2. Use a ParSeqRestClient – This is a wrapper around a 
RestClient that returns ParSeq Tasks and Promises. 
30
Async Rest.li requests 
– Callbacks 
Callback<Response<Greeting>> cb = new Callback() { 
void onSuccess(Response<Greeting> response) { 
// do something with the returned Greeting 
} 
void onError(Throwable e) { 
// whoops 
} 
} 
Request<Greeting> getRequest = BUILDERS.get().id(1L).build(); 
_restClient.sendRequest(getRequest, new RequestContext(), cb); 
31
Async Rest.li requests – defining 
a Callback 
Callback<Response<Greeting>> callback = new 
Callback() { 
void onSuccess(Response<Greeting> response) { 
// do something with the returned Greeting 
} 
void onError(Throwable e) { 
// whoops 
} 
} 
32
Async Rest.li requests – sending 
the request 
Request<Greeting> getRequest = 
BUILDERS.get().id(1L).build(); 
_restClient.sendRequest(getRequest, 
new RequestContext(), 
callback); 
33
Async Rest.li requests – using 
ParSeq 
• Callback based API is good for simple use cases (one or two 
requests and you are done.) 
• But it is hard to express more complicated call flows using the 
Callback API 
Callback ParSeq 
34
Async Rest.li requests – using 
ParSeq 
a1 a2 a3 
b1 b2 
c1 
35
Async Rest.li requests – using 
ParSeq 
Task<Response<?>> a1ResponseTask = 
_parseqRestClient.createTask(a1Request); 
Task<Response<?>> a2ResponseTask = 
_parseqRestClient.createTask(a2Request); 
Task<Response<?>> a3ResponseTask = 
_parseqRestClient.createTask(a3Request); a1 a2 a3 
b1 b2 
c1 
36
Async Rest.li requests – using 
ParSeq 
Task<Response<?>> b1ResponseTask = Tasks.callable("", new 
Callable<Task<Response<?>>() { 
@Override 
public Task<Response<?>> call() throws Exception { 
Response<?> a1Response = a1ResponseTask.get(); 
// Similarly, access the results from a2 and a3 as well 
// use this to build request b1Request 
return _parseqRestClient.createTask(b1Request) 
} 
}); 
Task<Response<?>> b2ResponseTask = 
_parseqRestClient.createTask(b2Request); 
a1 a2 a3 
b1 b2 
c1 
37
Async Rest.li requests – using 
ParSeq 
Task<Response<?>> c1ResponseTask = Tasks.callable("", new 
Callable<Task<Response<?>>() { 
@Override 
public Task<Response<?>> call() throws Exception { 
Response<?> b1Response = 
b1ResponseTask.get(); 
Response<?> b2Response = 
b2ResponseTask.get(); 
// use b1Response and b2Response for 
// c1Request 
return _parseqRestClient.createTask(c1Request) 
} 
}); 
a1 a2 a3 
b1 b2 
c1 
38
Async Rest.li requests – using 
ParSeq 
_engine.run( 
Tasks.seq( 
Tasks.par(a1ResponseTask, a2ResponseTask, a3ResponseTask), 
Tasks.par(b1ResponseTask, b2ResponseTask), 
c1ResponseTask)); 
a1 a2 a3 
b1 b2 
c1 
39
Conclusion 
• Rest.li is async and non-blocking under the hood 
• You can use Callbacks and ParSeq Tasks and Promises to 
write async Rest.li clients and servers 
40
Links and references 
• Rest.li user guide https://github.com/linkedin/rest.li/wiki/Rest.li- 
User-Guide 
• Asynchronous servers and clients in Rest.li 
https://github.com/linkedin/rest.li/wiki/Asynchronous-Servers-and- 
Clients-in-Rest.li 
• ParSeq https://github.com/linkedin/parseq 
41
Me. 
https://www.linkedin.com/in/parikhkaran 
https://github.com/karanparikh 
http://karanparikh.com/ 
42
Thanks! 
43

More Related Content

What's hot

Kafka Retry and DLQ
Kafka Retry and DLQKafka Retry and DLQ
Kafka Retry and DLQ
George Teo
 
Lambda Architecture with Spark, Spark Streaming, Kafka, Cassandra, Akka and S...
Lambda Architecture with Spark, Spark Streaming, Kafka, Cassandra, Akka and S...Lambda Architecture with Spark, Spark Streaming, Kafka, Cassandra, Akka and S...
Lambda Architecture with Spark, Spark Streaming, Kafka, Cassandra, Akka and S...
Helena Edelson
 
Mistakes - I’ve made a few. Blunders in event-driven architecture | Simon Aub...
Mistakes - I’ve made a few. Blunders in event-driven architecture | Simon Aub...Mistakes - I’ve made a few. Blunders in event-driven architecture | Simon Aub...
Mistakes - I’ve made a few. Blunders in event-driven architecture | Simon Aub...
HostedbyConfluent
 
A Practical Introduction to Apache Solr
A Practical Introduction to Apache SolrA Practical Introduction to Apache Solr
A Practical Introduction to Apache Solr
Angel Borroy López
 
Building High Performance APIs In Go Using gRPC And Protocol Buffers
Building High Performance APIs In Go Using gRPC And Protocol BuffersBuilding High Performance APIs In Go Using gRPC And Protocol Buffers
Building High Performance APIs In Go Using gRPC And Protocol Buffers
Shiju Varghese
 
Building Event Driven Services with Kafka Streams
Building Event Driven Services with Kafka StreamsBuilding Event Driven Services with Kafka Streams
Building Event Driven Services with Kafka Streams
Ben Stopford
 
Let's Build an Inverted Index: Introduction to Apache Lucene/Solr
Let's Build an Inverted Index: Introduction to Apache Lucene/SolrLet's Build an Inverted Index: Introduction to Apache Lucene/Solr
Let's Build an Inverted Index: Introduction to Apache Lucene/Solr
Sease
 
Producer Performance Tuning for Apache Kafka
Producer Performance Tuning for Apache KafkaProducer Performance Tuning for Apache Kafka
Producer Performance Tuning for Apache Kafka
Jiangjie Qin
 
Best Practice-React
Best Practice-ReactBest Practice-React
Best Practice-ReactYang Yang
 
Apache kafka-a distributed streaming platform
Apache kafka-a distributed streaming platformApache kafka-a distributed streaming platform
Apache kafka-a distributed streaming platform
confluent
 
High Concurrency Architecture at TIKI
High Concurrency Architecture at TIKIHigh Concurrency Architecture at TIKI
High Concurrency Architecture at TIKI
Nghia Minh
 
Kafka Streams: What it is, and how to use it?
Kafka Streams: What it is, and how to use it?Kafka Streams: What it is, and how to use it?
Kafka Streams: What it is, and how to use it?
confluent
 
Kafka: All an engineer needs to know
Kafka: All an engineer needs to knowKafka: All an engineer needs to know
Kafka: All an engineer needs to know
Thao Huynh Quang
 
Kafka Streams State Stores Being Persistent
Kafka Streams State Stores Being PersistentKafka Streams State Stores Being Persistent
Kafka Streams State Stores Being Persistent
confluent
 
API Design, A Quick Guide to REST, SOAP, gRPC, and GraphQL, By Vahid Rahimian
API Design, A Quick Guide to REST, SOAP, gRPC, and GraphQL, By Vahid RahimianAPI Design, A Quick Guide to REST, SOAP, gRPC, and GraphQL, By Vahid Rahimian
API Design, A Quick Guide to REST, SOAP, gRPC, and GraphQL, By Vahid Rahimian
Vahid Rahimian
 
Domain Driven Design - Strategic Patterns and Microservices
Domain Driven Design - Strategic Patterns and MicroservicesDomain Driven Design - Strategic Patterns and Microservices
Domain Driven Design - Strategic Patterns and Microservices
Radosław Maziarka
 
Reddit/Quora Software System Design
Reddit/Quora Software System DesignReddit/Quora Software System Design
Reddit/Quora Software System Design
Elia Ahadi
 
Improving fault tolerance and scaling out in Kafka Streams with Bill Bejeck |...
Improving fault tolerance and scaling out in Kafka Streams with Bill Bejeck |...Improving fault tolerance and scaling out in Kafka Streams with Bill Bejeck |...
Improving fault tolerance and scaling out in Kafka Streams with Bill Bejeck |...
HostedbyConfluent
 
Go micro framework to build microservices
Go micro framework to build microservicesGo micro framework to build microservices
Go micro framework to build microservices
TechMaster Vietnam
 
Building a High-Performance Distributed Task Queue on MongoDB
Building a High-Performance Distributed Task Queue on MongoDBBuilding a High-Performance Distributed Task Queue on MongoDB
Building a High-Performance Distributed Task Queue on MongoDBMongoDB
 

What's hot (20)

Kafka Retry and DLQ
Kafka Retry and DLQKafka Retry and DLQ
Kafka Retry and DLQ
 
Lambda Architecture with Spark, Spark Streaming, Kafka, Cassandra, Akka and S...
Lambda Architecture with Spark, Spark Streaming, Kafka, Cassandra, Akka and S...Lambda Architecture with Spark, Spark Streaming, Kafka, Cassandra, Akka and S...
Lambda Architecture with Spark, Spark Streaming, Kafka, Cassandra, Akka and S...
 
Mistakes - I’ve made a few. Blunders in event-driven architecture | Simon Aub...
Mistakes - I’ve made a few. Blunders in event-driven architecture | Simon Aub...Mistakes - I’ve made a few. Blunders in event-driven architecture | Simon Aub...
Mistakes - I’ve made a few. Blunders in event-driven architecture | Simon Aub...
 
A Practical Introduction to Apache Solr
A Practical Introduction to Apache SolrA Practical Introduction to Apache Solr
A Practical Introduction to Apache Solr
 
Building High Performance APIs In Go Using gRPC And Protocol Buffers
Building High Performance APIs In Go Using gRPC And Protocol BuffersBuilding High Performance APIs In Go Using gRPC And Protocol Buffers
Building High Performance APIs In Go Using gRPC And Protocol Buffers
 
Building Event Driven Services with Kafka Streams
Building Event Driven Services with Kafka StreamsBuilding Event Driven Services with Kafka Streams
Building Event Driven Services with Kafka Streams
 
Let's Build an Inverted Index: Introduction to Apache Lucene/Solr
Let's Build an Inverted Index: Introduction to Apache Lucene/SolrLet's Build an Inverted Index: Introduction to Apache Lucene/Solr
Let's Build an Inverted Index: Introduction to Apache Lucene/Solr
 
Producer Performance Tuning for Apache Kafka
Producer Performance Tuning for Apache KafkaProducer Performance Tuning for Apache Kafka
Producer Performance Tuning for Apache Kafka
 
Best Practice-React
Best Practice-ReactBest Practice-React
Best Practice-React
 
Apache kafka-a distributed streaming platform
Apache kafka-a distributed streaming platformApache kafka-a distributed streaming platform
Apache kafka-a distributed streaming platform
 
High Concurrency Architecture at TIKI
High Concurrency Architecture at TIKIHigh Concurrency Architecture at TIKI
High Concurrency Architecture at TIKI
 
Kafka Streams: What it is, and how to use it?
Kafka Streams: What it is, and how to use it?Kafka Streams: What it is, and how to use it?
Kafka Streams: What it is, and how to use it?
 
Kafka: All an engineer needs to know
Kafka: All an engineer needs to knowKafka: All an engineer needs to know
Kafka: All an engineer needs to know
 
Kafka Streams State Stores Being Persistent
Kafka Streams State Stores Being PersistentKafka Streams State Stores Being Persistent
Kafka Streams State Stores Being Persistent
 
API Design, A Quick Guide to REST, SOAP, gRPC, and GraphQL, By Vahid Rahimian
API Design, A Quick Guide to REST, SOAP, gRPC, and GraphQL, By Vahid RahimianAPI Design, A Quick Guide to REST, SOAP, gRPC, and GraphQL, By Vahid Rahimian
API Design, A Quick Guide to REST, SOAP, gRPC, and GraphQL, By Vahid Rahimian
 
Domain Driven Design - Strategic Patterns and Microservices
Domain Driven Design - Strategic Patterns and MicroservicesDomain Driven Design - Strategic Patterns and Microservices
Domain Driven Design - Strategic Patterns and Microservices
 
Reddit/Quora Software System Design
Reddit/Quora Software System DesignReddit/Quora Software System Design
Reddit/Quora Software System Design
 
Improving fault tolerance and scaling out in Kafka Streams with Bill Bejeck |...
Improving fault tolerance and scaling out in Kafka Streams with Bill Bejeck |...Improving fault tolerance and scaling out in Kafka Streams with Bill Bejeck |...
Improving fault tolerance and scaling out in Kafka Streams with Bill Bejeck |...
 
Go micro framework to build microservices
Go micro framework to build microservicesGo micro framework to build microservices
Go micro framework to build microservices
 
Building a High-Performance Distributed Task Queue on MongoDB
Building a High-Performance Distributed Task Queue on MongoDBBuilding a High-Performance Distributed Task Queue on MongoDB
Building a High-Performance Distributed Task Queue on MongoDB
 

Viewers also liked

From a monolith to microservices + REST: The evolution of LinkedIn's architec...
From a monolith to microservices + REST: The evolution of LinkedIn's architec...From a monolith to microservices + REST: The evolution of LinkedIn's architec...
From a monolith to microservices + REST: The evolution of LinkedIn's architec...
Karan Parikh
 
The new new competition - How digital platforms change competitive strategy
The new new competition - How digital platforms change competitive strategyThe new new competition - How digital platforms change competitive strategy
The new new competition - How digital platforms change competitive strategy
Platform Revolution
 
Wonderful mother teresa_--الأم العظيمه تريزا
Wonderful mother teresa_--الأم العظيمه تريزاWonderful mother teresa_--الأم العظيمه تريزا
Wonderful mother teresa_--الأم العظيمه تريزا
Ibrahimia Church Ftriends
 
ส.3 การใช้งานอินเทอร์เน็ต
ส.3 การใช้งานอินเทอร์เน็ตส.3 การใช้งานอินเทอร์เน็ต
ส.3 การใช้งานอินเทอร์เน็ตKhemjira_P
 
Dac presentation april_2012_final
Dac presentation april_2012_finalDac presentation april_2012_final
Dac presentation april_2012_finalCNOServices
 
072 2 9-2012 pm pt09 doc. قوة كلمة الله للتغيير و التحذير
072 2 9-2012 pm pt09 doc.         قوة كلمة الله  للتغيير و التحذير072 2 9-2012 pm pt09 doc.         قوة كلمة الله  للتغيير و التحذير
072 2 9-2012 pm pt09 doc. قوة كلمة الله للتغيير و التحذيرIbrahimia Church Ftriends
 
Evaluation of hollyoaks later trailer
Evaluation of hollyoaks later trailerEvaluation of hollyoaks later trailer
Evaluation of hollyoaks later trailerjenniferbarton18
 
Melissa welcome presentation
Melissa welcome presentationMelissa welcome presentation
Melissa welcome presentation
anarivera26
 
Later People of the Fertile Crescent: Sea Peoples
Later People of the Fertile Crescent: Sea PeoplesLater People of the Fertile Crescent: Sea Peoples
Later People of the Fertile Crescent: Sea Peoplesssclasstorremar
 
Minggu 1,2,3
Minggu 1,2,3Minggu 1,2,3
Minggu 1,2,3
hazmilplv
 
The Five Things a PM Should Know (Or Get Someone to Do) to Implement an EDRMS
The Five Things a PM Should Know (Or Get Someone to Do) to Implement an EDRMSThe Five Things a PM Should Know (Or Get Someone to Do) to Implement an EDRMS
The Five Things a PM Should Know (Or Get Someone to Do) to Implement an EDRMSjudyhu
 
Rebeccراحيل القس الياس مقار
Rebeccراحيل   القس الياس مقارRebeccراحيل   القس الياس مقار
Rebeccراحيل القس الياس مقار
Ibrahimia Church Ftriends
 
Social media marketing
Social media marketingSocial media marketing
Social media marketingYi Zhou
 
رئيس مصر دليلك للاختيار السليم- - بالحب للنمو و الازدهار- ميزان الادراه و ا...
رئيس مصر   دليلك للاختيار السليم- - بالحب للنمو و الازدهار- ميزان الادراه و ا...رئيس مصر   دليلك للاختيار السليم- - بالحب للنمو و الازدهار- ميزان الادراه و ا...
رئيس مصر دليلك للاختيار السليم- - بالحب للنمو و الازدهار- ميزان الادراه و ا...
Ibrahimia Church Ftriends
 

Viewers also liked (18)

From a monolith to microservices + REST: The evolution of LinkedIn's architec...
From a monolith to microservices + REST: The evolution of LinkedIn's architec...From a monolith to microservices + REST: The evolution of LinkedIn's architec...
From a monolith to microservices + REST: The evolution of LinkedIn's architec...
 
The new new competition - How digital platforms change competitive strategy
The new new competition - How digital platforms change competitive strategyThe new new competition - How digital platforms change competitive strategy
The new new competition - How digital platforms change competitive strategy
 
Wonderful mother teresa_--الأم العظيمه تريزا
Wonderful mother teresa_--الأم العظيمه تريزاWonderful mother teresa_--الأم العظيمه تريزا
Wonderful mother teresa_--الأم العظيمه تريزا
 
Creatividad
CreatividadCreatividad
Creatividad
 
ส.3 การใช้งานอินเทอร์เน็ต
ส.3 การใช้งานอินเทอร์เน็ตส.3 การใช้งานอินเทอร์เน็ต
ส.3 การใช้งานอินเทอร์เน็ต
 
Dac presentation april_2012_final
Dac presentation april_2012_finalDac presentation april_2012_final
Dac presentation april_2012_final
 
072 2 9-2012 pm pt09 doc. قوة كلمة الله للتغيير و التحذير
072 2 9-2012 pm pt09 doc.         قوة كلمة الله  للتغيير و التحذير072 2 9-2012 pm pt09 doc.         قوة كلمة الله  للتغيير و التحذير
072 2 9-2012 pm pt09 doc. قوة كلمة الله للتغيير و التحذير
 
English Profil
English ProfilEnglish Profil
English Profil
 
Leblanc oil
Leblanc oilLeblanc oil
Leblanc oil
 
Evaluation of hollyoaks later trailer
Evaluation of hollyoaks later trailerEvaluation of hollyoaks later trailer
Evaluation of hollyoaks later trailer
 
Melissa welcome presentation
Melissa welcome presentationMelissa welcome presentation
Melissa welcome presentation
 
Later People of the Fertile Crescent: Sea Peoples
Later People of the Fertile Crescent: Sea PeoplesLater People of the Fertile Crescent: Sea Peoples
Later People of the Fertile Crescent: Sea Peoples
 
Minggu 1,2,3
Minggu 1,2,3Minggu 1,2,3
Minggu 1,2,3
 
The Five Things a PM Should Know (Or Get Someone to Do) to Implement an EDRMS
The Five Things a PM Should Know (Or Get Someone to Do) to Implement an EDRMSThe Five Things a PM Should Know (Or Get Someone to Do) to Implement an EDRMS
The Five Things a PM Should Know (Or Get Someone to Do) to Implement an EDRMS
 
Rebeccراحيل القس الياس مقار
Rebeccراحيل   القس الياس مقارRebeccراحيل   القس الياس مقار
Rebeccراحيل القس الياس مقار
 
Social media marketing
Social media marketingSocial media marketing
Social media marketing
 
رئيس مصر دليلك للاختيار السليم- - بالحب للنمو و الازدهار- ميزان الادراه و ا...
رئيس مصر   دليلك للاختيار السليم- - بالحب للنمو و الازدهار- ميزان الادراه و ا...رئيس مصر   دليلك للاختيار السليم- - بالحب للنمو و الازدهار- ميزان الادراه و ا...
رئيس مصر دليلك للاختيار السليم- - بالحب للنمو و الازدهار- ميزان الادراه و ا...
 
Evaluation 2
Evaluation 2Evaluation 2
Evaluation 2
 

Similar to Async servers and clients in Rest.li

Building Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaBuilding Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJava
Rick Warren
 
Why async matters
Why async mattersWhy async matters
Why async matters
timbc
 
Scaling asp.net websites to millions of users
Scaling asp.net websites to millions of usersScaling asp.net websites to millions of users
Scaling asp.net websites to millions of users
oazabir
 
What is new in java 8 concurrency
What is new in java 8 concurrencyWhat is new in java 8 concurrency
What is new in java 8 concurrency
kshanth2101
 
Threads, Queues, and More: Async Programming in iOS
Threads, Queues, and More: Async Programming in iOSThreads, Queues, and More: Async Programming in iOS
Threads, Queues, and More: Async Programming in iOS
TechWell
 
Reactive Java: Promises and Streams with Reakt (JavaOne Talk 2016)
Reactive Java:  Promises and Streams with Reakt (JavaOne Talk 2016)Reactive Java:  Promises and Streams with Reakt (JavaOne Talk 2016)
Reactive Java: Promises and Streams with Reakt (JavaOne Talk 2016)
Rick Hightower
 
Reactive Java: Promises and Streams with Reakt (JavaOne talk 2016)
Reactive Java: Promises and Streams with Reakt  (JavaOne talk 2016)Reactive Java: Promises and Streams with Reakt  (JavaOne talk 2016)
Reactive Java: Promises and Streams with Reakt (JavaOne talk 2016)
Rick Hightower
 
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
Pavan Chitumalla
 
Don't Wait! Develop Responsive Applications with Java EE7 Instead
Don't Wait! Develop Responsive Applications with Java EE7 InsteadDon't Wait! Develop Responsive Applications with Java EE7 Instead
Don't Wait! Develop Responsive Applications with Java EE7 Instead
WASdev Community
 
"Service Worker: Let Your Web App Feel Like a Native "
"Service Worker: Let Your Web App Feel Like a Native ""Service Worker: Let Your Web App Feel Like a Native "
"Service Worker: Let Your Web App Feel Like a Native "
FDConf
 
Middleware webnextconf - 20152609
Middleware   webnextconf - 20152609Middleware   webnextconf - 20152609
Middleware webnextconf - 20152609
Christian Horsdal
 
Node.js: Continuation-Local-Storage and the Magic of AsyncListener
Node.js: Continuation-Local-Storage and the Magic of AsyncListenerNode.js: Continuation-Local-Storage and the Magic of AsyncListener
Node.js: Continuation-Local-Storage and the Magic of AsyncListener
Islam Sharabash
 
Async Programming in C# 5
Async Programming in C# 5Async Programming in C# 5
Async Programming in C# 5
Pratik Khasnabis
 
Sharding and Load Balancing in Scala - Twitter's Finagle
Sharding and Load Balancing in Scala - Twitter's FinagleSharding and Load Balancing in Scala - Twitter's Finagle
Sharding and Load Balancing in Scala - Twitter's Finagle
Geoff Ballinger
 
동기화 시대를 뛰어넘는 비동기 프로그래밍
동기화 시대를 뛰어넘는 비동기 프로그래밍동기화 시대를 뛰어넘는 비동기 프로그래밍
동기화 시대를 뛰어넘는 비동기 프로그래밍
명신 김
 
Everything you wanted to know about writing async, concurrent http apps in java
Everything you wanted to know about writing async, concurrent http apps in java Everything you wanted to know about writing async, concurrent http apps in java
Everything you wanted to know about writing async, concurrent http apps in java
Baruch Sadogursky
 
Play Framework: async I/O with Java and Scala
Play Framework: async I/O with Java and ScalaPlay Framework: async I/O with Java and Scala
Play Framework: async I/O with Java and Scala
Yevgeniy Brikman
 
Avoiding callback hell in Node js using promises
Avoiding callback hell in Node js using promisesAvoiding callback hell in Node js using promises
Avoiding callback hell in Node js using promises
Ankit Agarwal
 
Multi-service reactive streams using Spring, Reactor, RSocket
Multi-service reactive streams using Spring, Reactor, RSocketMulti-service reactive streams using Spring, Reactor, RSocket
Multi-service reactive streams using Spring, Reactor, RSocket
Stéphane Maldini
 

Similar to Async servers and clients in Rest.li (20)

Building Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaBuilding Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJava
 
JavaCro'15 - Spring @Async - Dragan Juričić
JavaCro'15 - Spring @Async - Dragan JuričićJavaCro'15 - Spring @Async - Dragan Juričić
JavaCro'15 - Spring @Async - Dragan Juričić
 
Why async matters
Why async mattersWhy async matters
Why async matters
 
Scaling asp.net websites to millions of users
Scaling asp.net websites to millions of usersScaling asp.net websites to millions of users
Scaling asp.net websites to millions of users
 
What is new in java 8 concurrency
What is new in java 8 concurrencyWhat is new in java 8 concurrency
What is new in java 8 concurrency
 
Threads, Queues, and More: Async Programming in iOS
Threads, Queues, and More: Async Programming in iOSThreads, Queues, and More: Async Programming in iOS
Threads, Queues, and More: Async Programming in iOS
 
Reactive Java: Promises and Streams with Reakt (JavaOne Talk 2016)
Reactive Java:  Promises and Streams with Reakt (JavaOne Talk 2016)Reactive Java:  Promises and Streams with Reakt (JavaOne Talk 2016)
Reactive Java: Promises and Streams with Reakt (JavaOne Talk 2016)
 
Reactive Java: Promises and Streams with Reakt (JavaOne talk 2016)
Reactive Java: Promises and Streams with Reakt  (JavaOne talk 2016)Reactive Java: Promises and Streams with Reakt  (JavaOne talk 2016)
Reactive Java: Promises and Streams with Reakt (JavaOne talk 2016)
 
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
 
Don't Wait! Develop Responsive Applications with Java EE7 Instead
Don't Wait! Develop Responsive Applications with Java EE7 InsteadDon't Wait! Develop Responsive Applications with Java EE7 Instead
Don't Wait! Develop Responsive Applications with Java EE7 Instead
 
"Service Worker: Let Your Web App Feel Like a Native "
"Service Worker: Let Your Web App Feel Like a Native ""Service Worker: Let Your Web App Feel Like a Native "
"Service Worker: Let Your Web App Feel Like a Native "
 
Middleware webnextconf - 20152609
Middleware   webnextconf - 20152609Middleware   webnextconf - 20152609
Middleware webnextconf - 20152609
 
Node.js: Continuation-Local-Storage and the Magic of AsyncListener
Node.js: Continuation-Local-Storage and the Magic of AsyncListenerNode.js: Continuation-Local-Storage and the Magic of AsyncListener
Node.js: Continuation-Local-Storage and the Magic of AsyncListener
 
Async Programming in C# 5
Async Programming in C# 5Async Programming in C# 5
Async Programming in C# 5
 
Sharding and Load Balancing in Scala - Twitter's Finagle
Sharding and Load Balancing in Scala - Twitter's FinagleSharding and Load Balancing in Scala - Twitter's Finagle
Sharding and Load Balancing in Scala - Twitter's Finagle
 
동기화 시대를 뛰어넘는 비동기 프로그래밍
동기화 시대를 뛰어넘는 비동기 프로그래밍동기화 시대를 뛰어넘는 비동기 프로그래밍
동기화 시대를 뛰어넘는 비동기 프로그래밍
 
Everything you wanted to know about writing async, concurrent http apps in java
Everything you wanted to know about writing async, concurrent http apps in java Everything you wanted to know about writing async, concurrent http apps in java
Everything you wanted to know about writing async, concurrent http apps in java
 
Play Framework: async I/O with Java and Scala
Play Framework: async I/O with Java and ScalaPlay Framework: async I/O with Java and Scala
Play Framework: async I/O with Java and Scala
 
Avoiding callback hell in Node js using promises
Avoiding callback hell in Node js using promisesAvoiding callback hell in Node js using promises
Avoiding callback hell in Node js using promises
 
Multi-service reactive streams using Spring, Reactor, RSocket
Multi-service reactive streams using Spring, Reactor, RSocketMulti-service reactive streams using Spring, Reactor, RSocket
Multi-service reactive streams using Spring, Reactor, RSocket
 

Recently uploaded

2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx
Georgi Kodinov
 
Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
abdulrafaychaudhry
 
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Globus
 
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Shahin Sheidaei
 
Accelerate Enterprise Software Engineering with Platformless
Accelerate Enterprise Software Engineering with PlatformlessAccelerate Enterprise Software Engineering with Platformless
Accelerate Enterprise Software Engineering with Platformless
WSO2
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2
 
Multiple Your Crypto Portfolio with the Innovative Features of Advanced Crypt...
Multiple Your Crypto Portfolio with the Innovative Features of Advanced Crypt...Multiple Your Crypto Portfolio with the Innovative Features of Advanced Crypt...
Multiple Your Crypto Portfolio with the Innovative Features of Advanced Crypt...
Hivelance Technology
 
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data AnalysisProviding Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Globus
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
Globus
 
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume MontevideoVitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke
 
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus
 
Advanced Flow Concepts Every Developer Should Know
Advanced Flow Concepts Every Developer Should KnowAdvanced Flow Concepts Every Developer Should Know
Advanced Flow Concepts Every Developer Should Know
Peter Caitens
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
Matt Welsh
 
How to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good PracticesHow to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good Practices
Globus
 
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Globus
 
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.ILBeyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Natan Silnitsky
 
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdfDominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
AMB-Review
 
Using IESVE for Room Loads Analysis - Australia & New Zealand
Using IESVE for Room Loads Analysis - Australia & New ZealandUsing IESVE for Room Loads Analysis - Australia & New Zealand
Using IESVE for Room Loads Analysis - Australia & New Zealand
IES VE
 
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, BetterWebinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
XfilesPro
 
Quarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden ExtensionsQuarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden Extensions
Max Andersen
 

Recently uploaded (20)

2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx
 
Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
 
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
 
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
 
Accelerate Enterprise Software Engineering with Platformless
Accelerate Enterprise Software Engineering with PlatformlessAccelerate Enterprise Software Engineering with Platformless
Accelerate Enterprise Software Engineering with Platformless
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
Multiple Your Crypto Portfolio with the Innovative Features of Advanced Crypt...
Multiple Your Crypto Portfolio with the Innovative Features of Advanced Crypt...Multiple Your Crypto Portfolio with the Innovative Features of Advanced Crypt...
Multiple Your Crypto Portfolio with the Innovative Features of Advanced Crypt...
 
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data AnalysisProviding Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
 
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume MontevideoVitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume Montevideo
 
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024
 
Advanced Flow Concepts Every Developer Should Know
Advanced Flow Concepts Every Developer Should KnowAdvanced Flow Concepts Every Developer Should Know
Advanced Flow Concepts Every Developer Should Know
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
 
How to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good PracticesHow to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good Practices
 
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
 
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.ILBeyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
 
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdfDominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
 
Using IESVE for Room Loads Analysis - Australia & New Zealand
Using IESVE for Room Loads Analysis - Australia & New ZealandUsing IESVE for Room Loads Analysis - Australia & New Zealand
Using IESVE for Room Loads Analysis - Australia & New Zealand
 
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, BetterWebinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
 
Quarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden ExtensionsQuarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden Extensions
 

Async servers and clients in Rest.li

  • 1. Async servers and clients in Rest.li 1
  • 2. (Please read the speaker notes) 2
  • 3. What is this Rest.li thing you speak about? “Rest.li is an open source REST framework for building robust, scalable RESTful architectures using type-safe bindings and asynchronous, non-blocking I/O.” 3
  • 4. The Stack Rest.li Data and REST API D2 Dynamic Discovery and load balancing R2 Network communication 4
  • 5. What do you by mean by async? 5
  • 6. What do you mean by async (I/O)? 6 Request 1 Request 2 Blocked on I/O Time Sync Async Free CPU
  • 7. Rest.li is async and non-blocking under the hood! 7
  • 9. How is R2 async and non-blocking? • Netty based async client • Jetty based server – configuration change (link) needed to run the server in async mode Rest.li D2 R2 9
  • 10. How is D2 async and non-blocking? • All communication with ZooKeeper uses the asynchronous APIs • ZooKeeper pushes data to clients in case of updates Rest.li D2 R2 10
  • 11. How is Rest.li async and non-blocking? • Does not handle I/O • I/O is taken care of by R2 • R2 is async and non-blocking! • Uses ParSeq when interacting with and delegating to application code. Rest.li D2 R2 11
  • 13. Async Server Implementations • The Rest.li framework is async and non-blocking under the hood. • As a result of this, if you do any blocking work in your method implementation it can negatively impact your application throughput as threads are held up by your application which are needed by Rest.li. (if you are using Rest.li in async mode) 13
  • 14. Async Server Implementations - Options 1. Callback based 2. ParSeq based 14
  • 15. Async Server – Callback @RestMethod.Get public void get(final Long id, @CallbackParam final Callback<Greeting> callback) { String path = "/data/" + id; _zkClient.getData(path, false, new DataCallback() { public void processResult(int i, String s, Object o, byte[] b, Stat st) { if (b.length == 0) { callback.onError(new RestLiServiceException(HttpStatus.S_404_NOT_FOUND)); } else { callback.onSuccess(buildGreeting(b)); } } }, null); } 15
  • 16. Async Server – Callback Signature @RestMethod.Get public void get(final Long id, @CallbackParam final Callback<Greeting> callback) com.linkedin.common.Callback 16
  • 17. Async Server – Filling out the callback _zkClient.getData(path, false, new DataCallback() { public void processResult(int i, String s, Object o, byte[] b, Stat st) { if (b.length == 0) { callback.onError(new RestLiServiceException(HttpStatus.S_404_NOT_FOUND)); } else { callback.onSuccess(buildGreeting(b)); } } }, null); 17
  • 18. Async Server – Callback @RestMethod.Get public void get(final Long id, @CallbackParam final Callback<Greeting> callback) { String path = "/data/" + id; _zkClient.getData(path, false, new DataCallback() { public void processResult(int i, String s, Object o, byte[] b, Stat st) { if (b.length == 0) { callback.onError(new RestLiServiceException(HttpStatus.S_404_NOT_FOUND)); } else { callback.onSuccess(buildGreeting(b)); } } }, null); } 18
  • 19. Async server - ParSeq 19
  • 20. Key ParSeq Concepts • Promise Fully async Java Future + listener mechanism. • Task Basic unit of work that is similar to Java Callable. Task<T> • Engine runs Tasks. • Context Used by a Task to run sub-Tasks. • Composition par and seq (link) 20
  • 21. Async Server – ParSeq @RestMethod.Get public Task<Greeting> get(final Long id) { final Task<FileData> fileDataTask = buildFileDataTask(); final Task<Greeting> mainTask = Tasks.callable("main", new Callable<Greeting>() { @Override public Greeting call() throws Exception { FileData fileData = fileDataTask.get(); return buildGreetingFromFileData(id, fileData); } }); return Tasks.seq(fileDataTask, mainTask); } 21
  • 22. Async Server – ParSeq signature @RestMethod.Get public Task<Greeting> get(final Long id) 22
  • 23. Async Server – ParSeq body final Task<FileData> fileDataTask = buildFileDataTask(); 23
  • 24. Async Server – ParSeq body final Task<Greeting> mainTask = Tasks.callable("main", new Callable<Greeting>() { @Override public Greeting call() throws Exception { FileData fileData = fileDataTask.get(); return buildGreetingFromFileData(id, fileData); } }); 24
  • 25. Async Server – assembling the Tasks return Tasks.seq(fileDataTask, mainTask); 25 fileDataTask mainTask
  • 26. Async Server – ParSeq @RestMethod.Get public Task<Greeting> get(final Long id) { final Task<FileData> fileDataTask = buildFileDataTask(); final Task<Greeting> mainTask = Tasks.callable("main", new Callable<Greeting>() { @Override public Greeting call() throws Exception { FileData fileData = fileDataTask.get(); return buildGreetingFromFileData(id, fileData); } }); return Tasks.seq(fileDataTask, mainTask); } 26
  • 27. Async Server – ParSeq • Can use this approach to build complex call graphs and return the final Task. (more on this later). • Can use ParSeq tracing • No callback hell! 27
  • 29. Async Rest.li requests • RestClient is async and non-blocking under the hood – it uses ParSeq and Netty. • Applications can still block the thread if they block on the results of the Rest.li call! Response response = _restClient.sendRequest(BUILDER.get().id(1L).build()).get(); Fortune fortune = response.getEntity(); Blocking on the result of a Future 29
  • 30. Async Rest.li requests Two Options: 1. Callback based API 2. Use a ParSeqRestClient – This is a wrapper around a RestClient that returns ParSeq Tasks and Promises. 30
  • 31. Async Rest.li requests – Callbacks Callback<Response<Greeting>> cb = new Callback() { void onSuccess(Response<Greeting> response) { // do something with the returned Greeting } void onError(Throwable e) { // whoops } } Request<Greeting> getRequest = BUILDERS.get().id(1L).build(); _restClient.sendRequest(getRequest, new RequestContext(), cb); 31
  • 32. Async Rest.li requests – defining a Callback Callback<Response<Greeting>> callback = new Callback() { void onSuccess(Response<Greeting> response) { // do something with the returned Greeting } void onError(Throwable e) { // whoops } } 32
  • 33. Async Rest.li requests – sending the request Request<Greeting> getRequest = BUILDERS.get().id(1L).build(); _restClient.sendRequest(getRequest, new RequestContext(), callback); 33
  • 34. Async Rest.li requests – using ParSeq • Callback based API is good for simple use cases (one or two requests and you are done.) • But it is hard to express more complicated call flows using the Callback API Callback ParSeq 34
  • 35. Async Rest.li requests – using ParSeq a1 a2 a3 b1 b2 c1 35
  • 36. Async Rest.li requests – using ParSeq Task<Response<?>> a1ResponseTask = _parseqRestClient.createTask(a1Request); Task<Response<?>> a2ResponseTask = _parseqRestClient.createTask(a2Request); Task<Response<?>> a3ResponseTask = _parseqRestClient.createTask(a3Request); a1 a2 a3 b1 b2 c1 36
  • 37. Async Rest.li requests – using ParSeq Task<Response<?>> b1ResponseTask = Tasks.callable("", new Callable<Task<Response<?>>() { @Override public Task<Response<?>> call() throws Exception { Response<?> a1Response = a1ResponseTask.get(); // Similarly, access the results from a2 and a3 as well // use this to build request b1Request return _parseqRestClient.createTask(b1Request) } }); Task<Response<?>> b2ResponseTask = _parseqRestClient.createTask(b2Request); a1 a2 a3 b1 b2 c1 37
  • 38. Async Rest.li requests – using ParSeq Task<Response<?>> c1ResponseTask = Tasks.callable("", new Callable<Task<Response<?>>() { @Override public Task<Response<?>> call() throws Exception { Response<?> b1Response = b1ResponseTask.get(); Response<?> b2Response = b2ResponseTask.get(); // use b1Response and b2Response for // c1Request return _parseqRestClient.createTask(c1Request) } }); a1 a2 a3 b1 b2 c1 38
  • 39. Async Rest.li requests – using ParSeq _engine.run( Tasks.seq( Tasks.par(a1ResponseTask, a2ResponseTask, a3ResponseTask), Tasks.par(b1ResponseTask, b2ResponseTask), c1ResponseTask)); a1 a2 a3 b1 b2 c1 39
  • 40. Conclusion • Rest.li is async and non-blocking under the hood • You can use Callbacks and ParSeq Tasks and Promises to write async Rest.li clients and servers 40
  • 41. Links and references • Rest.li user guide https://github.com/linkedin/rest.li/wiki/Rest.li- User-Guide • Asynchronous servers and clients in Rest.li https://github.com/linkedin/rest.li/wiki/Asynchronous-Servers-and- Clients-in-Rest.li • ParSeq https://github.com/linkedin/parseq 41

Editor's Notes

  1. R2 – RESTful abstraction built on Netty and Jetty. D2 – Dynamic discovery and client side load balancing using ZooKeeper. Rest.li – Data layer + layer that exposes RESTful API that application can use to build RESTful services.
  2. Async I/O basically means that we free up our thread of computation to do other things while we are waiting for the I/O to complete. In other words we make an I/O request and we don’t block waiting on the result of the I/O to appear. Let’s look at one thread on the server. Assume both request 1 and request 2 arrive at the same time. In each request the thread does some work, then makes an I/O request of some sort, and then uses the values from the I/O response to fulfill the request. In the synchronous model we can’t start processing request 2 until request 1 is done because the thread is blocked on I/O. In the gray portions our server is essentially idle. In the async model we can start processing request 2 instead of blocking on the I/O to complete.
  3. For the rest of the talk we will assume we are running the R2 server in async mode.
  4. Jetty configuration is needed to run Rest.li in async mode. If you are running Rest.li in a thread-per-request model async programming will not make much of a difference since the thread cannot be re-used to serve new requests.
  5. ParSeq is a framework that makes it easier to write asynchronous code in Java. Created by LinkedIn and is an open source project.
  6. In this example we are fetching data from ZooKeeper using the async ZooKeeper API and then converting that data into a Greeting object to return.
  7. Need to explicitly specify the callback in the method signature. Notice the void return type. The next slide will explain how a response is sent back to the client.
  8. The callback API exposes two methods – onSuccess and onError. In this example we invoke the onSuccess method if the data we get from ZooKeeper has a length > 0. We invoke the onError method otherwise. Once either onError or onSucess has been invoked the framework will return a response back to the client.
  9. ParSeq is a library that makes it easy to write complex async task flows in Java. It was created by LinkedIn and is an open source project.
  10. Difference between Task and Callable is that in a Task you can set the result asynchronously.
  11. In this example we read data from the disk asynchronously and use that to build a Greeting object. buildFileDataTask (implementation not shown here) reads some file on disk using async I/O and returns a Task<FileData>, where FileData (implementation not shown here) is some abstraction for the data being read. We use FileData to build a Greeting to return to the client.
  12. Return ParSeq tasks from methods. These are run by Rest.li using the internal ParSeq engine. Task<T>  if you run this Task using a ParSeq engine it will return you a T eventually.
  13. We first read a file on disk using some async I/O abstraction that gives us back a Task for the data read.
  14. The basic idea to use ParSeq for Rest.li async method implementations is to return Tasks or Promises. We want to transform the FileData into a Greeting to return to the user. We define a new Task, called mainTask in the example above, to do this. Within the call method of mainTask we obtain the FileData from the fileDataTask. This is a non-blocking call because of the way we assemble our final call graph (more on this in a bit). Finally, we build a Greeting in the buildGreetingFromFileData (implementation not shown here) method.
  15. This is what will be returned from the overall method. Tasks.seq is a way to build a call graph between Tasks in ParSeq. In this example we are saying that we want mainTask to run after fileDataTask. This is because mainTask depends on fileDataTask. Once we express our call graph dependency in this way, when we call fileDataTask.get() within the mainTask it will either return right away or throw an exception. This is because ParSeq will make sure that mainTask only gets run AFTER fileDataTask has completed. Tasks.seq() returns a new Task and this Task will get run by the underlying ParSeq engine within Rest.li.
  16. This call is blocking because sendRequest returns a Future, and calling get() on the Future waits until the operation has been completed.
  17. This is very similar to callback based approached present in Node.js and JavaScript.
  18. The first thing we need to do is define the callback that will be executed when the server sends us a response, or there is an error.
  19. Then we use the Callback based sendRequest API to send the request. Rest.li invokes the callback for you upon getting a result.
  20. Each circle is a response from making a Rest.li request. Each layer represents requests being made in parallel. The yellow circle Is the final result.
  21. b1 and b2 don’t depend on each other so theoretically b2 could have been run in the same level as a1, a2, or a3.
  22. Use the parseq rest client to create three response tasks.
  23. Combine the results from a1-a3 and use that to make another request task b1
  24. Similarly combine the results of b1 and b2 and create another request task c1
  25. Use the Tasks.seq() and Tasks.par() methods to build the call graph. Within each level we want each Task to run in parallel, which is why we use Tasks.par(a1ResponseTask, a2ResponseTask, a3ResponseTask) and Tasks.par(b1ResponseTask, b2ResponseTask). Finally, we want each level to run sequentially one after the other, which is why wrap everything in a Tasks.seq.