SlideShare a Scribd company logo
gRPC vs REST: let the battle begin!
Alex Borysov @aiborisov
Mykyta Protsenko @mykyta_p
Who are we?
Mykyta Protsenko
Software Engineer @ Netflix
• passionate about all things scalable
• 18+ years in software engineering
• avid biker
• Author of Henka
Alex Borysov
Software Engineer @ Google
• large scale systems developer
• 12+ years in software engineering
• devoxx.org.ua PC member
• Active gRPC user
REST vs gRPC
@aiborisov
@mykyta_p
devoxx.org.ua
November 23-24, 2018
Kyiv, Ukraine
Save the Date!
#VoxxedDaysMinsk
@aiborisov
@aiborisov
@mykyta_p
@aiborisov
@mykyta_p
@aiborisov
@mykyta_p
JSON over HTTP
@aiborisov
@mykyta_p
I am getting frustrated by the number of people calling any
HTTP-based interface a REST API.
Roy Fielding
http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
@aiborisov
@mykyta_p
@aiborisov
@mykyta_p
@aiborisov
@mykyta_p
RESTful API
GET /user/15
{
“name”: “John Doe”,
“email”:“john.doe@gmail.com”,
...
}
non-RESTful API
GET /last_search?page=2
{
“products”: [...]
...
}
@aiborisov
@mykyta_p
What is gRPC?
@aiborisov
@mykyta_p
What is gRPC?
A high performance, general purpose, feature-rich
RPC framework.
Part of Cloud Native Computing Foundation cncf.io
HTTP/2 and mobile first.
Open sourced version of Stubby RPC used in Google.
@aiborisov
@mykyta_p
g in gRPC stands for
1.0 'gRPC'
1.1 'good'
1.2 'green'
1.3 'gentle'
. . .
1.11 'gorgeous'
1.12 'glorious'
1.13 'gloriosa'
1.14 'gladiolus'
@aiborisov
@mykyta_p
https://github.com/grpc/grpc/blob/master/doc/g_stands_for.md
RPC?! But...
AMF?
RMI?
CORBA?
@aiborisov
@mykyta_p
Image by Dan4th Nicholas. See slide #177 for details.
gRPC is not RMI
Maitainability
Ease of use
Performance
Scalability
L
e
s
s
o
n
s
Years of using Stubby
@aiborisov
@mykyta_p
What is gRPC?
Abstractions and best practices on how to design
RPCs.
Default implementation(s) from Google.
Extension points to plug custom implementations and
modifications.
Supports 10+ programming languages
@aiborisov
@mykyta_p
What is gRPC?
Abstractions and best practices on how to design
RPCs.
Default implementation(s) from Google.
Extension points to plug custom implementations and
modifications.
Supports 10+ programming languages, including JS!
@aiborisov
@mykyta_p
gRPC Interoperability
Java
Service
Python
Service
GoLang
Service
C++
Service
gRPC
Service
gRPC
Stub
gRPC
Stub
gRPC
Stub
gRPC
Service
gRPC
Service
gRPC
Service
@aiborisov
@mykyta_p
gRPC
Stub
gRPC-
Web
Stub
Apples to Oranges?
@aiborisov
@mykyta_p
Microservices?
@aiborisov
@mykyta_p
Microservices?
How to draw an owl?
@aiborisov
@mykyta_p
Microservices?
How to draw an owl?
How to build microservices?
@aiborisov
@mykyta_p
Microservices?
How to draw an owl?
How to build microservices?
Draw some circles.
@aiborisov
@mykyta_p
Microservices?
How to draw an owl?
How to build microservices?
Draw some circles.
Take XYZ framework.
@aiborisov
@mykyta_p
Microservices?
How to draw an owl?
How to build microservices?
Draw the REST of the owlDraw some circles.
Take XYZ framework.
@aiborisov
@mykyta_p
Image by https://www.flickr.com/photos/centralasian/. See slide #177 for details.
Microservices?
How to draw an owl?
How to build microservices?
Draw the REST of the owl
Write your microservices!
Draw some circles.
Take XYZ framework.
@aiborisov
@mykyta_p
Image by https://www.flickr.com/photos/centralasian/. See slide #177 for details.
Microservices
@aiborisov
@mykyta_p
Microservices
@aiborisov
@mykyta_p
Microservices
@aiborisov
@mykyta_p
Microservices
@aiborisov
@mykyta_p
Remote Calls
@aiborisov
@mykyta_p
Call Flow
@aiborisov
@mykyta_p
Service Discovery?
?
?
?
?
?
?
@aiborisov
@mykyta_p
Multiple Instances
#1
#N
#2
?
?
?
. . .
@aiborisov
@mykyta_p
Call Flow
@aiborisov
@mykyta_p
Call Flow
@aiborisov
@mykyta_p
Call Flow
@aiborisov
@mykyta_p
Call Flow
@aiborisov
@mykyta_p
Call Flow
@aiborisov
@mykyta_p
Slow Services?
@aiborisov
@mykyta_p
Failure Scenarios
@aiborisov
@mykyta_p
A distributed system is one in which the failure of a
computer you didn't even know existed can render your own
computer unusable.
Leslie Lamport, 1987
https://www.microsoft.com/en-us/research/wp-content/uploads/2016/12/Distribution.pdf
@aiborisov
@mykyta_p
Fault Tolerance
@aiborisov
@mykyta_p
Microservices?! But...
Performance Hit?
Service Discovery?
Load Balancing?
Fault Tolerance?
Monitoring?
Testing?
@aiborisov
@mykyta_p
Image by Dan4th Nicholas. See slide #177 for details.
Sample Problem
Client
@aiborisov
@mykyta_p
Sample Problem: Aggregator
Src
#2
Src
#1
Aggr
...
Src
#X
Client
@aiborisov
@mykyta_p
Heterogeneous Data Format
Src
#2
Src
#1
Aggr
...
Src
#X
<XML>...<XML>
{JSON}
Binary 110011
[ Unified Format ]
Client
@aiborisov
@mykyta_p
REST: It’s All About Resources
@aiborisov
@mykyta_p
REST: Call Hierarchy
Controller
Service
Data Source A
. . .
Data Source N
RestTemplate
RestTemplate
RestTemplate
@aiborisov
@mykyta_p
REST: Data Source
JSON
URL: http://pokemon.com/content/11
{
"id": 11,
"content": "Pikachu"
}
XML
URL: http://crypto.com/content/22
<ContentResponse>
<id>22</id>
<content>Ethereum</content>
</ContentResponse>
@aiborisov
@mykyta_p
REST: Data Source
...
ResponseEntity<Content> contentEntity = restTemplate.getForEntity(
url + "{content_id}"
Content.class,
ImmutableMap.of("content_id", contentId));
...
@aiborisov
@mykyta_p
REST: Service
public class AggregatingService {
public AggregatedContent fetch(int id) {
...
return new AggregatedContent(...);
}
}
public class AggregatedContent {
private Integer id;
private String type;
private String content;
private Integer nextId;
@aiborisov
@mykyta_p
REST: Service
public class AggregatingService {
public AggregatedContent fetch(int id) {
...
return new AggregatedContent(...);
}
}
public class AggregatedContent {
private Integer id;
private String type;
private String content;
private Integer nextId;
@aiborisov
@mykyta_p
REST: Service
public class AggregatingService {
public AggregatedContent fetch(int id) {
...
return new AggregatedContent(...);
}
}
public class AggregatedContent {
private Integer id; // 115
private String type; // Pokemon
private String content; // Pikachu
private Integer nextId; // 116
@aiborisov
@mykyta_p
REST: Service
public class AggregatingService {
public AggregatedContent fetch(int id) {
...
return new AggregatedContent(...);
}
}
public class AggregatedContent {
private Integer id; // 115
private String type; // Pokemon
private String content; // Pikachu
private Integer nextId; // 116
@aiborisov
@mykyta_p
REST: Controller
@GetMapping(
value = "/content/{id}",
produces = "application/json")
public AggregatedContent aggregated(@PathVariable("id") int id) {
return aggregatingService.fetch(id);
}
@aiborisov
@mykyta_p
REST: It’s All About Resources
@GetMapping(
value = "/content/{id}",
produces = "application/json")
public AggregatedContent aggregated(@PathVariable("id") int id) {
return aggregatingService.fetch(id);
}
@aiborisov
@mykyta_p
REST: It’s simple
http://localhost:8080/content/115
{
"id": 115,
"content_type": "CRYPTO",
"content": "Ethereum",
"next_uri": "/content/116"
}
@aiborisov
@mykyta_p
REST: Service Discovery
@aiborisov
@mykyta_p
k8s/pokemon.yaml
...
kind: Service
metadata:
name: rest-pokemon-content-service
k8s/aggregator.yaml
...
env:
- name: datasource_a_url
value: "http://rest-pokemon-content-service:8080"
REST: Service Discovery
@aiborisov
@mykyta_p
k8s/pokemon.yaml
...
kind: Service
metadata:
name: rest-pokemon-content-service
k8s/aggregator.yaml
...
env:
- name: datasource_a_url
value: "http://rest-pokemon-content-service:8080"
REST: Service Discovery
@aiborisov
@mykyta_p
Controllers and POJOs, oh my!
public class AggregatedContent {
@JsonProperty("id")
private Integer id;
@JsonProperty("type")
private String type;
@JsonProperty("content")
private String content;
@JsonProperty("next_uri")
private String nextUri;
...
}
{
"id": 115,
"content_type": "Pokemon",
"content": "Pikachu",
"next_uri": "/content/116"
}
@aiborisov
@mykyta_p
gRPC: It’s All About APIs
@aiborisov
@mykyta_p
Sample Problem: Aggregator
Src
#2
Src
#1
Aggr
...
Src
#X
Client
@aiborisov
@mykyta_p
Service Definition (aggregator.proto)
@aiborisov
@mykyta_p
Service Definition (aggregator.proto)
syntax = "proto3";
service AggregationService {
rpc Get(AggregationRequest)
returns (AggregationResponse);
}
@aiborisov
@mykyta_p
Service Definition (aggregator.proto)
syntax = "proto3";
service AggregationService {
rpc Get(AggregationRequest)
returns (AggregationResponse);
}
message AggregationRequest {
int32 item_id = 1;
}
message AggregationResponse {
int32 id = 1;
ResponseType type = 2;
string content = 3;
int32 next_item_id = 4;
}
enum ResponseType {
UNDEFINED = 0;
POKEMON = 1;
CRYPTO = 2;
}
@aiborisov
@mykyta_p
Service Definition
aggregator.proto
@aiborisov
@mykyta_p
Service Definition
aggregator.proto
gRPC Runtime
@aiborisov
@mykyta_p
Service Definition
aggregator.proto
AggregationServiceImplBase.java AggregationRequest.java
AggregationResponse.java
AggregationServiceStub.java
AggregationServiceFutureStub.java
AggregationServiceBlockingStub.java
Service Implementation Request and response Client libraries
@aiborisov
@mykyta_p
gRPC Java Runtime
Implement gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void get(AggregationRequest request,
StreamObserver<AggregationResponse> responseObserver) {
}
}
@aiborisov
@mykyta_p
Implement gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void get(AggregationRequest request,
StreamObserver<AggregationResponse> responseObserver) {
}
}
Generated service class
@aiborisov
@mykyta_p
Implement gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void get(AggregationRequest request,
StreamObserver<AggregationResponse> responseObserver) {
}
}
@aiborisov
@mykyta_p
Implement gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void get(AggregationRequest request,
public interface StreamObserver<AggregationResponse> responseObserver){{
void onNext(AggregationResponse response);
void onCompleted();
void onError(Throwable error);
}
}
}
@aiborisov
@mykyta_p
Implement gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void get(AggregationRequest request,
StreamObserver<AggregationResponse> responseObserver) {
AggregationResponse response = AggregationResponse
.newBuilder()
.setId(request.getItemId())
.setContent("Ethereum")
.setType(ResponseType.CRYPTO)
.build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}
@aiborisov
@mykyta_p
Implement gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void get(AggregationRequest request,
StreamObserver<AggregationResponse> responseObserver) {
AggregationResponse response = AggregationResponse
.newBuilder()
.setId(request.getItemId())
.setContent("Ethereum")
.setType(ResponseType.CRYPTO)
.build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}
@aiborisov
@mykyta_p
Service Definition (aggregator.proto)
syntax = "proto3";
service AggregationService {
rpc Get(AggregationRequest)
returns (AggregationResponse);
}
message AggregationRequest {
int32 item_id = 1;
}
message AggregationResponse {
int32 id = 1;
ResponseType type = 2;
string content = 3;
int32 next_item_id = 4;
}
enum ResponseType {
UNDEFINED = 0;
POKEMON = 1;
CRYPTO = 2;
}
@aiborisov
@mykyta_p
Service Definition (aggregator.proto)
syntax = "proto3";
service AggregationService {
rpc Get(AggregationRequest)
returns (AggregationResponse);
}
message AggregationRequest {
}
message AggregationResponse {
int32 id = 1;
ResponseType type = 2;
string content = 3;
}
enum ResponseType {
UNDEFINED = 0;
POKEMON = 1;
CRYPTO = 2;
}
@aiborisov
@mykyta_p
Service Definition (aggregator.proto)
syntax = "proto3";
service AggregationService {
rpc Get(AggregationRequest)
returns (AggregationResponse);
}
message AggregationRequest {
}
message AggregationResponse {
int32 id = 1;
ResponseType type = 2;
string content = 3;
}
enum ResponseType {
UNDEFINED = 0;
POKEMON = 1;
CRYPTO = 2;
}
@aiborisov
@mykyta_p
Service Definition (aggregator.proto)
syntax = "proto3";
service AggregationService {
rpc Get(AggregationRequest)
returns (stream AggregationResponse);
}
message AggregationRequest {
}
message AggregationResponse {
int32 id = 1;
ResponseType type = 2;
string content = 3;
}
enum ResponseType {
UNDEFINED = 0;
POKEMON = 1;
CRYPTO = 2;
}
@aiborisov
@mykyta_p
Service Definition (aggregator.proto)
syntax = "proto3";
service AggregationService {
rpc Subscribe(AggregationRequest)
returns (stream AggregationResponse);
}
message AggregationRequest {
}
message AggregationResponse {
int32 id = 1;
ResponseType type = 2;
string content = 3;
}
enum ResponseType {
UNDEFINED = 0;
POKEMON = 1;
CRYPTO = 2;
}
@aiborisov
@mykyta_p
Service Definition (aggregator.proto)
syntax = "proto3";
service AggregationService {
rpc Subscribe(AggregationRequest)
returns (stream AggregationResponse);
}
message AggregationRequest {
}
message AggregationResponse {
int32 id = 1;
ResponseType type = 2;
string content = 3;
}
enum ResponseType {
UNDEFINED = 0;
POKEMON = 1;
CRYPTO = 2;
}
@aiborisov
@mykyta_p
Sample Problem: Aggregator
Src
#2
Src
#1
Aggr
...
Src
#X
Client
aggregator.proto
@aiborisov
@mykyta_p
Sample Problem: Content
Src
#2
Src
#1
Aggr
...
Src
#X
Client
aggregator.proto
content.proto
@aiborisov
@mykyta_p
content.proto
syntax = "proto3";
service ContentService {
rpc Subscribe(ContentRequest)
returns (stream ContentResponse);
}
message ContentRequest {
}
message ContentResponse {
int32 id = 1;
string content = 2;
}
@aiborisov
@mykyta_p
Streaming gRPC Service
public class AggregationService extends AggregationServiceImplBase {
private final Collection<ContentServiceStub> contentStubs;
public AggregationService(Collection<ContentServiceStub> contentStubs) {
this.contentStubs = contentStubs;
}
...
@aiborisov
@mykyta_p
Streaming gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void subscribe(AggregationRequest request,StreamObserver<AggregationResponse> responseObserver) {
contentStubs.forEach(stub -> { stub.subscribe(ContentRequest.getDefaultInstance(),
new StreamObserver<ContentResponse>() {
@Override
public void onNext(ContentResponse response) {
...
}
@Override
public void onError(Throwable error) {
responseObserver.onError(error);
}
@Override
public void onCompleted() {}
});
});
}
@aiborisov
@mykyta_p
Streaming gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void subscribe(AggregationRequest request,StreamObserver<AggregationResponse> responseObserver) {
contentStubs.forEach(stub -> { stub.subscribe(ContentRequest.getDefaultInstance(),
new StreamObserver<ContentResponse>() {
@Override
public void onNext(ContentResponse response) {
...
}
@Override
public void onError(Throwable error) {
responseObserver.onError(error);
}
@Override
public void onCompleted() {}
});
});
}
@aiborisov
@mykyta_p
Streaming gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void subscribe(AggregationRequest request,StreamObserver<AggregationResponse> responseObserver) {
contentStubs.forEach(stub -> { stub.subscribe(ContentRequest.getDefaultInstance(),
new StreamObserver<ContentResponse>() {
@Override
public void onNext(ContentResponse response) {
...
}
@Override
public void onError(Throwable error) {
responseObserver.onError(error);
}
@Override
public void onCompleted() {}
});
});
}
@aiborisov
@mykyta_p
Streaming gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void subscribe(AggregationRequest request,StreamObserver<AggregationResponse> responseObserver) {
contentStubs.forEach(stub -> { stub.subscribe(ContentRequest.getDefaultInstance(),
new StreamObserver<ContentResponse>() {
@Override
public void onNext(ContentResponse response) {
...
}
@Override
public void onError(Throwable error) {
responseObserver.onError(error);
}
@Override
public void onCompleted() {}
});
});
}
@aiborisov
@mykyta_p
Streaming gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void subscribe(AggregationRequest request,StreamObserver<AggregationResponse> responseObserver) {
contentStubs.forEach(stub -> { stub.subscribe(ContentRequest.getDefaultInstance(),
new StreamObserver<ContentResponse>() {
@Override
public void onNext(ContentResponse response) {
ResponseType type = typeForStub(stub);
int aggregationId = aggregationId(response.getId(), type);
AggregationResponse aggrResponse =
AggregationResponse.newBuilder()
.setContent(response.getContent()).setId(aggregationId).
.setType(type).build();
responseObserver.onNext(aggrResponse);
}
});
});
}
@aiborisov
@mykyta_p
Streaming gRPC Service
public class AggregationService extends AggregationServiceImplBase {
@Override
public void subscribe(AggregationRequest request,StreamObserver<AggregationResponse> responseObserver) {
contentStubs.forEach(stub -> { stub.subscribe(ContentRequest.getDefaultInstance(),
new StreamObserver<ContentResponse>() {
@Override
public void onNext(ContentResponse response) {
ResponseType type = typeForStub(stub);
int aggregationId = aggregationId(response.getId(), type);
AggregationResponse aggrResponse =
AggregationResponse.newBuilder()
.setContent(response.getContent()).setId(aggregationId).
.setType(type).build();
responseObserver.onNext(aggrResponse);
}
});
});
}
@aiborisov
@mykyta_p
Streaming gRPC Service
Src
#2
Src
#1
Aggr
...
Src
#X
Client
@aiborisov
@mykyta_p
Streaming gRPC Service
Src
#2
Src
#1
Aggr
...
Src
#X
Client Subscribe()
@aiborisov
@mykyta_p
Streaming gRPC Service
Src
#2
Src
#1
Aggr
...
Src
#X
Client Subscribe()
Subscribe()
Subscribe()
Subscribe()
@aiborisov
@mykyta_p
Streaming gRPC Service
Src
#2
Src
#1
Aggr
...
Src
#X
Client
onNext()
@aiborisov
@mykyta_p
Streaming gRPC Service
Src
#2
Src
#1
Aggr
...
Src
#X
Client
onNext()
onNext()
@aiborisov
@mykyta_p
Streaming gRPC Service
Src
#2
Src
#1
Aggr
...
Src
#X
Client
onNext()
@aiborisov
@mykyta_p
Streaming gRPC Service
Src
#2
Src
#1
Aggr
...
Src
#X
Client onNext()
onNext()
@aiborisov
@mykyta_p
Start gRPC Server
ContentServiceStub cryptoClient = ...
ContentServiceStub pokemonClient = ...
Server grpcServer = NettyServerBuilder.forPort(8080)
.addService(new AggregationService(asList(cryptoClient, pokemonClient)))
.build().start();
@aiborisov
@mykyta_p
Start gRPC Server
ContentServiceStub cryptoClient = ...
ContentServiceStub pokemonClient = ...
Server grpcServer = NettyServerBuilder.forPort(8080)
.addService(new AggregationService(asList(cryptoClient, pokemonClient)))
.build().start();
@aiborisov
@mykyta_p
Create gRPC Client
String host = System.getenv("crypto_host");
int post = Integer.valueOf(System.getenv("crypto_port"));
ManagedChannel cryptoChannel = NettyChannelBuilder.forAddress(host, port).build();
@aiborisov
@mykyta_p
Create gRPC Client
String host = System.getenv("crypto_host");
int post = Integer.valueOf(System.getenv("crypto_port"));
ManagedChannel cryptoChannel = NettyChannelBuilder.forAddress(host, port).build();
ContentServiceStub cryptoClient = ContentServiceGrpc.newStub(cryptoChannel);
@aiborisov
@mykyta_p
Create gRPC Client
String host = System.getenv("crypto_host");
int port = Integer.valueOf(System.getenv("crypto_port"));
ManagedChannel cryptoChannel = NettyChannelBuilder.forAddress(host, port).build();
ContentServiceStub cryptoClient = ContentServiceGrpc.newStub(cryptoChannel);
ContentServiceBlockingStub cryptoBlockingClient =
ContentServiceGrpc.newBlockingStub(cryptoChannel);
@aiborisov
@mykyta_p
Create gRPC Client
tring host = System.getenv("crypto_host");
int port = Integer.valueOf(System.getenv("crypto_port"));
ManagedChannel cryptoChannel = NettyChannelBuilder.forAddress(host, port).build();
ContentServiceStub cryptoClient = ContentServiceGrpc.newStub(cryptoChannel);
ContentServiceBlockingStub cryptoBlockingClient =
ContentServiceGrpc.newBlockingStub(cryptoChannel);
ContentServiceFutureStub cryptoFutureClient =
ContentServiceGrpc.newFutureStub(cryptoChannel);
@aiborisov
@mykyta_p
Service Discovery & Load Balancing
String host = System.getenv("crypto_host");
int post = Integer.valueOf(System.getenv("crypto_port"));
ManagedChannel cryptoChannel = NettyChannelBuilder.forAddress(host, port).build();
@aiborisov
@mykyta_p
Service Discovery & Load Balancing
ManagedChannel cryptoChannel = NettyChannelBuilder.forAddress(host, port).build();
@aiborisov
@mykyta_p
Service Discovery & Load Balancing
ManagedChannel cryptoChannel = NettyChannelBuilder.forTarget("crypto")
.build();
@aiborisov
@mykyta_p
Service Discovery & Load Balancing
ManagedChannel cryptoChannel = NettyChannelBuilder.forTarget("crypto")
.nameResolverFactory(new DnsNameResolverProvider())
.loadBalancerFactory(RoundRobinLoadBalancerFactory.getInstance())
.build();
@aiborisov
@mykyta_p
Service Discovery & Load Balancing
ManagedChannel cryptoChannel = NettyChannelBuilder.forTarget("crypto")
.nameResolverFactory(new MyCustomNameResolverProviderFactory())
.loadBalancerFactory(new MyMoonPhaseLoadBalancerFactory())
.build();
@aiborisov
@mykyta_p
Netty
ManagedChannel cryptoChannel = NettyChannelBuilder.forTarget("crypto")
.nameResolverFactory(new MyCustomNameResolverProvider())
.loadBalancerFactory(new MyMoonPhaseLoadBalancerFactory())
.build();
@aiborisov
@mykyta_p
Netty + HTTP/2 + Protobuf
@aiborisov
@mykyta_p
Netty + HTTP/2 + Protobuf = Performance
http://www.grpc.io/docs/guides/benchmarking.html
@aiborisov
@mykyta_p
8 core VMs, streaming throughput
Netty + HTTP/2 + Protobuf = Performance
http://www.grpc.io/docs/guides/benchmarking.html
@aiborisov
@mykyta_p
32 core VMs, streaming throughput
Client Latency
...
900 ms!
@aiborisov
@mykyta_p
Caching
CDN
9 ms
...
@aiborisov
@mykyta_p
Serverless
pay as you go
Func
Funcinput
...
Func
input
...
input
@aiborisov
@mykyta_p
All about resources
IDL optional
Synchronous by default
Unary
Perfect fit for serverless
All about APIs
IDL centric
Asynchronous by nature
Streaming or Unary
Performance first
REST gRPC
@aiborisov
@mykyta_p
Sample Problem
Src
#2
Src
#1
...
Src
#X
Client Aggr
@aiborisov
@mykyta_p
Sample Problem: Voting
Src
#2
Src
#1
...
Src
#X
Client
Voting
Aggr
@aiborisov
@mykyta_p
Sample Problem: Voting
Src
#2
Src
#1
...
Src
#X
Client
Voting
Aggr
@aiborisov
@mykyta_p
Sample Problem: Voting
Src
#2
Src
#1
...
Src
#X
Client
Voting
Aggr
@aiborisov
@mykyta_p
Sample Problem: Voting & Leaderboard
Src
#2
Src
#1
...
Src
#X
Client
Voting
Aggr
L-board
@aiborisov
@mykyta_p
Sample Problem: Voting & Leaderboard
Src
#2
Src
#1
...
Src
#X
Client
Voting
Aggr
L-board
@aiborisov
@mykyta_p
Sample Problem: Voting & Leaderboard
Src
#2
Src
#1
...
Src
#X
Gateway
Voting
Aggr
L-board
@aiborisov
@mykyta_p
Sample Problem
Src
#2
Src
#1
...
Src
#X
Gateway
VotingL-board
Aggr
@aiborisov
@mykyta_p
Failing Leaderboard
Src
#2
Src
#1
...
Src
#X
Gateway
Voting
Aggr
@aiborisov
@mykyta_p
Cascading Failure
Src
#2
Src
#1
...
Src
#X
Gateway
Voting
Aggr
@aiborisov
@mykyta_p
Cascading Failure
Src
#2
Src
#1
...
Src
#X
Gateway
Voting
Aggr
@aiborisov
@mykyta_p
Cascading Failure
Src
#2
Src
#1
...
Src
#X
Gateway
Voting
Aggr
@aiborisov
@mykyta_p
Circuit Breaker
Src
#2
Src
#1
...
Src
#X
Gateway
VotingL-board
Aggr
@aiborisov
@mykyta_p
Circuit Breaker
Src
#2
Src
#1
...
Src
#X
Gateway
VotingL-board
Aggr
@aiborisov
@mykyta_p
Circuit Breaker
Src
#2
Src
#1
...
Src
#X
Gateway
VotingL-board
Aggr
@aiborisov
@mykyta_p
Circuit Breaker
Src
#2
Src
#1
...
Src
#X
Gateway
VotingL-board
Aggr
@aiborisov
@mykyta_p
Circuit Breaker
Src
#2
Src
#1
...
Src
#X
Gateway
VotingL-board
Aggr
@aiborisov
@mykyta_p
Circuit Breaker
Src
#2
Src
#1
...
Src
#X
Gateway
VotingL-board
Aggr
@aiborisov
@mykyta_p
Slow Services
Src
#2
Src
#1
...
Src
#X
Gateway
VotingL-board
Aggr
@aiborisov
@mykyta_p
Timeouts?
Src
#2
Src
#1
...
Src
#X
Gateway
VotingL-board
Aggr
200 ms
2 sec
@aiborisov
@mykyta_p
Large Timeouts
Gateway Voting L-Board
1,000 ms
timeout
1,000 ms
timeout
200 ms
client timeout
@aiborisov
@mykyta_p
Large Timeouts
Gateway Voting L-Board
1,000 ms
timeout
1,000 ms
timeout
200 ms
client timeout
50 ms
@aiborisov
@mykyta_p
Large Timeouts
Gateway Voting L-Board
1,000 ms
timeout
1,000 ms
timeout
200 ms
client timeout
50 ms
400 ms
@aiborisov
@mykyta_p
Large Timeouts
Gateway Voting L-Board
1,000 ms
timeout
1,000 ms
timeout
200 ms
client timeout
50 ms
400 ms
@aiborisov
@mykyta_p
Large Timeouts
Gateway Voting L-Board
1,000 ms
timeout
1,000 ms
timeout
200 ms
client timeout
50 ms
400 ms
300 ms
@aiborisov
@mykyta_p
Short Timeouts
Gateway Voting L-Board
100 ms
timeout
100 ms
timeout
@aiborisov
@mykyta_p
Short Timeouts
Gateway Voting L-Board
100 ms
timeout
100 ms
timeout
2,000 ms
client timeout
@aiborisov
@mykyta_p
Short Timeouts
Gateway Voting L-Board
100 ms
timeout
100 ms
timeout
2,000 ms
client timeout
50 ms
@aiborisov
@mykyta_p
Short Timeouts
Gateway Voting L-Board
100 ms
timeout
100 ms
timeout
2,000 ms
client timeout
50 ms
400 ms
@aiborisov
@mykyta_p
Short Timeouts
Gateway Voting L-Board
100 ms
timeout
100 ms
timeout
2,000 ms
client timeout
50 ms
400 ms
@aiborisov
@mykyta_p
Short Timeouts
Gateway Voting L-Board
100 ms
timeout
100 ms
timeout
2,000 ms
client timeout
50 ms
400 ms
@aiborisov
@mykyta_p
gRPC Deadline Propagation
Gateway Voting L-Board
200 ms
client timeout
@aiborisov
@mykyta_p
gRPC Deadline Propagation
Gateway Voting L-Board
200 ms
client timeout
50 ms
@aiborisov
@mykyta_p
gRPC Deadline Propagation
Gateway Voting L-Board
200 - 50 ms
timeout
200 ms
client timeout
50 ms
@aiborisov
@mykyta_p
gRPC Deadline Propagation
Gateway Voting L-Board
200 - 50 ms
timeout
200 ms
client timeout
50 ms
400 ms
@aiborisov
@mykyta_p
gRPC Deadline Propagation
Gateway Voting L-Board
200 - 50 - 400 ms
timeout
200 - 50 ms
timeout
200 ms
client timeout
50 ms
400 ms
@aiborisov
@mykyta_p
gRPC Deadline Propagation (Short)
Gateway Voting L-Board
200 - 50 - 400 ms
timeout
200 - 50 ms
timeout
200 ms
client timeout
50 ms
400 ms
@aiborisov
@mykyta_p
gRPC Deadline Propagation (Large)
Gateway Voting L-Board
2,000 - 50 - 400 ms
timeout
2,000 - 50 ms
timeout
2,000 ms
client timeout
50 ms
400 ms
300 ms
@aiborisov
@mykyta_p
Investigation
Src
#2
Src
#1
...
Src
#X
Gateway
VotingL-board
Aggr
@aiborisov
@mykyta_p
Gateway
VotingL-board
Aggr
Investigation
Src
#2
Src
#1
...
Src
#X
@aiborisov
@mykyta_p
VotingL-board
Aggr
Investigation
Src
#2
Src
#1
...
Src
#X
Gateway
@aiborisov
@mykyta_p
L-board
Aggr
Investigation
Src
#2
Src
#1
...
Src
#X
Gateway
Voting
@aiborisov
@mykyta_p
L-board
Aggr
Investigation
Src
#2
Src
#1
...
Src
#X
Gateway
Voting
@aiborisov
@mykyta_p
Aggr
L-board
Investigation
Src
#2
Src
#1
...
Src
#X
Gateway
Voting
@aiborisov
@mykyta_p
Aggr
L-board
Investigation
Src
#2
Src
#1
...
Src
#X
Gateway
Voting
@aiborisov
@mykyta_p
Zipkin: Traces and Latency
@aiborisov
@mykyta_p
Zipkin and gRPC
https://github.com/openzipkin/brave/tree/master/instrumentation/grpc
URLConnectionSender sender = ...
GrpcTracing grpcTracing = GrpcTracing.create(Tracing.newBuilder()
.sampler(ALWAYS_SAMPLE).spanReporter(AsyncReporter.create(sender)).build());
@aiborisov
@mykyta_p
Zipkin and gRPC
https://github.com/openzipkin/brave/tree/master/instrumentation/grpc
URLConnectionSender sender = ...
GrpcTracing grpcTracing = GrpcTracing.create(Tracing.newBuilder()
.sampler(ALWAYS_SAMPLE).spanReporter(AsyncReporter.create(sender)).build());
ManagedChannel cryptoChannel = NettyChannelBuilder.forAddress(cryptoHost, cryptoPort)
.intercept(grpcTracing.newClientInterceptor())
.build();
Server grpcServer = NettyServerBuilder.forPort(8080)
.addService(new AggregationService(asList(cryptoClient, pokemonClient)))
.intercept(grpcTracing.newServerInterceptor())
.build().start();
@aiborisov
@mykyta_p
Zipkin and gRPC
https://github.com/openzipkin/brave/tree/master/instrumentation/grpc
URLConnectionSender sender = ...
GrpcTracing grpcTracing = GrpcTracing.create(Tracing.newBuilder()
.sampler(ALWAYS_SAMPLE).spanReporter(AsyncReporter.create(sender)).build());
ManagedChannel cryptoChannel = NettyChannelBuilder.forAddress(cryptoHost, cryptoPort)
.intercept(grpcTracing.newClientInterceptor())
.build();
Server grpcServer = NettyServerBuilder.forPort(8080)
.addService(new AggregationService(asList(cryptoClient, pokemonClient)))
.intercept(grpcTracing.newServerInterceptor())
.build().start();
@aiborisov
@mykyta_p
Zipkin and REST
build.gradle:
dependencies {
compile 'org.springframework.cloud:spring-cloud-sleuth-zipkin'
compile 'org.springframework.cloud:spring-cloud-starter-sleuth'
...
application.properties:
spring.zipkin.baseUrl=http://zipkin:9411/
# sample 100%
spring.sleuth.sampler.percentage=1.0
...
@aiborisov
@mykyta_p
Zipkin : REST and gRPC
@aiborisov
@mykyta_p
http://Oscon.GrpcVsRest.com
@aiborisov
@mykyta_p
Crypto or Pokemon?
iStock.com/RichVintage
Explore More?
Demo: https://github.com/grpcvsrest
@aiborisov
@mykyta_p
Explore More?
Demo: https://github.com/grpcvsrest
http://grpc.io
https://github.com/grpc
http://www.grpc.io/docs/quickstart/java.html
gRPC -Web: https://github.com/grpc/grpc-web
gRPC Google group: grpc-io@googlegroups.com
REST: http://google.com/search?q=rest
@aiborisov
@mykyta_p
gRPC or REST?
iStock.com/RichVintage
Demo UI is written by
Yevgen Golubenko
Software Engineer @ Anomali
• Twitter: @HalloGene_
• github.com/HalloGene
• linkedin.com/in/yevgen-golubenko
@aiborisov
@mykyta_p
REST gRPC
@aiborisov
@mykyta_p
All about resources
Synchronous and unary
Simplicity first
External fault-tolerance
Production ready
All about APIs
Async and streaming
Performance first
Built-in fault-tolerance
Production ready
REST gRPC
@aiborisov
@mykyta_p
All about resources
Synchronous and unary
Simplicity first
External fault-tolerance
Production ready
All about APIs
Async and streaming
Performance first
Built-in fault-tolerance
Production ready
REST gRPC
Be pragmatic,
start with your problem!
@aiborisov
@mykyta_p
Questions?
@aiborisov
@mykyta_p
Image by https://www.flickr.com/photos/centralasian/. See slide #177 for details.
Images Used
@aiborisov
@mykyta_p
Slides ##24, 25, 176: https://www.flickr.com/photos/centralasian/5229725173
● licenced by CC BY 2.0: https://creativecommons.org/licenses/by/2.0/
● changes were made
Slides ##13, 43: https://www.flickr.com/photos/dan4th/2295925353/
● licenced by CC BY 2.0: https://creativecommons.org/licenses/by/2.0/
● no changes were made
Slides ## 171,173: iStock.com/RichVintage
● https://www.istockphoto.com/legal/license-agreement
● no changes were made

More Related Content

PDF
Devoxx Ukraine 2018 "Break me if you can: practical guide to building fault-t...
PDF
"gRPC vs REST: let the battle begin!" GeeCON Krakow 2018 edition
PDF
"Enabling Googley microservices with gRPC" VoxxedDays Minsk edition
PDF
gRPC vs REST: let the battle begin!
PDF
DevNexus 2020 "Break me if you can: practical guide to building fault-toleran...
PDF
"gRPC vs REST: let the battle begin!" DevoxxUK 2018 edition
PDF
Break me if you can: practical guide to building fault-tolerant systems (with...
PDF
OSCON 2019 "Break me if you can: practical guide to building fault-tolerant s...
Devoxx Ukraine 2018 "Break me if you can: practical guide to building fault-t...
"gRPC vs REST: let the battle begin!" GeeCON Krakow 2018 edition
"Enabling Googley microservices with gRPC" VoxxedDays Minsk edition
gRPC vs REST: let the battle begin!
DevNexus 2020 "Break me if you can: practical guide to building fault-toleran...
"gRPC vs REST: let the battle begin!" DevoxxUK 2018 edition
Break me if you can: practical guide to building fault-tolerant systems (with...
OSCON 2019 "Break me if you can: practical guide to building fault-tolerant s...

What's hot (20)

PDF
gRPC vs REST: let the battle begin!
PDF
"gRPC-Web: It’s All About Communication": Devoxx Belgium 2019
PDF
"gRPC-Web: It’s All About Communication": Devoxx Ukraine 2019
PDF
"gRPC-Web: It’s All About Communication": Devoxx Ukraine 2019
PDF
"Enabling Googley microservices with gRPC" Riga DevDays 2018 edition
PDF
Cloud Expo Europe 2022 "Break me if you can: practical guide to building faul...
PDF
REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...
PDF
Curl with rust
PDF
HTTP/3 is next generation HTTP
PDF
common mistakes when using libcurl
PDF
2018 IterateConf Deconstructing and Evolving REST Security
PDF
REST API vs gRPC, which one should you use in breaking a monolith [Kdg.net 2018]
PDF
curl better
PDF
JavaLand gRPC vs REST API
PDF
HTTP/3 in curl
PPTX
Docker Docker - Docker Security - Docker
PDF
WordPress RESTful API & Amazon API Gateway - WordCamp Kansai 2016
PDF
HTTP/3 for everyone
PDF
Http3 fullstackfest-2019
PDF
HTTP/3 in curl 2020
gRPC vs REST: let the battle begin!
"gRPC-Web: It’s All About Communication": Devoxx Belgium 2019
"gRPC-Web: It’s All About Communication": Devoxx Ukraine 2019
"gRPC-Web: It’s All About Communication": Devoxx Ukraine 2019
"Enabling Googley microservices with gRPC" Riga DevDays 2018 edition
Cloud Expo Europe 2022 "Break me if you can: practical guide to building faul...
REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...
Curl with rust
HTTP/3 is next generation HTTP
common mistakes when using libcurl
2018 IterateConf Deconstructing and Evolving REST Security
REST API vs gRPC, which one should you use in breaking a monolith [Kdg.net 2018]
curl better
JavaLand gRPC vs REST API
HTTP/3 in curl
Docker Docker - Docker Security - Docker
WordPress RESTful API & Amazon API Gateway - WordCamp Kansai 2016
HTTP/3 for everyone
Http3 fullstackfest-2019
HTTP/3 in curl 2020
Ad

Similar to "gRPC vs REST: let the battle begin!" OSCON 2018 edition (20)

PDF
The spring ecosystem in 50 min
PDF
Managing microservices with istio on OpenShift - Meetup
PDF
How Netflix Is Solving Authorization Across Their Cloud
KEY
Deploying Next Gen Systems with Zero Downtime
PDF
HowYourAPIBeMyAPI
PDF
Guillotina: The Asyncio REST Resource API
PDF
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
PDF
Devoxx Belgium 2022 gRPC Cornerstone: HTTP/2… or HTTP/3?
PDF
OWASPAPISecurity
PPTX
Serverless and Servicefull Applications - Where Microservices complements Ser...
PDF
2018 jPrime Deconstructing and Evolving REST Security
PDF
Building Hypermedia APIs in JavaScript
PDF
Secure Credential Management with CredHub - Eoghan Kelleher
PDF
Day 2 Kubernetes - Tools for Operability (HashiConf)
PDF
Building APIs in an easy way using API Platform
PDF
Serverless and serverfull - where microservices compliments serverless
PDF
Ibm_interconnect_restapi_workshop
PDF
Building Serverless applications with Python
PDF
8 Lessons Learned from Using Kafka in 1500 microservices - confluent streamin...
PDF
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
The spring ecosystem in 50 min
Managing microservices with istio on OpenShift - Meetup
How Netflix Is Solving Authorization Across Their Cloud
Deploying Next Gen Systems with Zero Downtime
HowYourAPIBeMyAPI
Guillotina: The Asyncio REST Resource API
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Devoxx Belgium 2022 gRPC Cornerstone: HTTP/2… or HTTP/3?
OWASPAPISecurity
Serverless and Servicefull Applications - Where Microservices complements Ser...
2018 jPrime Deconstructing and Evolving REST Security
Building Hypermedia APIs in JavaScript
Secure Credential Management with CredHub - Eoghan Kelleher
Day 2 Kubernetes - Tools for Operability (HashiConf)
Building APIs in an easy way using API Platform
Serverless and serverfull - where microservices compliments serverless
Ibm_interconnect_restapi_workshop
Building Serverless applications with Python
8 Lessons Learned from Using Kafka in 1500 microservices - confluent streamin...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Ad

Recently uploaded (20)

PPTX
M Tech Sem 1 Civil Engineering Environmental Sciences.pptx
PDF
composite construction of structures.pdf
PDF
PPT on Performance Review to get promotions
PPTX
bas. eng. economics group 4 presentation 1.pptx
PDF
III.4.1.2_The_Space_Environment.p pdffdf
PDF
Operating System & Kernel Study Guide-1 - converted.pdf
PPTX
UNIT-1 - COAL BASED THERMAL POWER PLANTS
PPTX
CARTOGRAPHY AND GEOINFORMATION VISUALIZATION chapter1 NPTE (2).pptx
PPTX
Foundation to blockchain - A guide to Blockchain Tech
PDF
PREDICTION OF DIABETES FROM ELECTRONIC HEALTH RECORDS
PPT
Mechanical Engineering MATERIALS Selection
PPTX
web development for engineering and engineering
PPTX
FINAL REVIEW FOR COPD DIANOSIS FOR PULMONARY DISEASE.pptx
PPTX
additive manufacturing of ss316l using mig welding
PDF
BIO-INSPIRED HORMONAL MODULATION AND ADAPTIVE ORCHESTRATION IN S-AI-GPT
PDF
Mitigating Risks through Effective Management for Enhancing Organizational Pe...
PPTX
Artificial Intelligence
PDF
keyrequirementskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
PPTX
Infosys Presentation by1.Riyan Bagwan 2.Samadhan Naiknavare 3.Gaurav Shinde 4...
PPTX
OOP with Java - Java Introduction (Basics)
M Tech Sem 1 Civil Engineering Environmental Sciences.pptx
composite construction of structures.pdf
PPT on Performance Review to get promotions
bas. eng. economics group 4 presentation 1.pptx
III.4.1.2_The_Space_Environment.p pdffdf
Operating System & Kernel Study Guide-1 - converted.pdf
UNIT-1 - COAL BASED THERMAL POWER PLANTS
CARTOGRAPHY AND GEOINFORMATION VISUALIZATION chapter1 NPTE (2).pptx
Foundation to blockchain - A guide to Blockchain Tech
PREDICTION OF DIABETES FROM ELECTRONIC HEALTH RECORDS
Mechanical Engineering MATERIALS Selection
web development for engineering and engineering
FINAL REVIEW FOR COPD DIANOSIS FOR PULMONARY DISEASE.pptx
additive manufacturing of ss316l using mig welding
BIO-INSPIRED HORMONAL MODULATION AND ADAPTIVE ORCHESTRATION IN S-AI-GPT
Mitigating Risks through Effective Management for Enhancing Organizational Pe...
Artificial Intelligence
keyrequirementskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
Infosys Presentation by1.Riyan Bagwan 2.Samadhan Naiknavare 3.Gaurav Shinde 4...
OOP with Java - Java Introduction (Basics)

"gRPC vs REST: let the battle begin!" OSCON 2018 edition