SlideShare a Scribd company logo
1 of 177
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

What's hot

gRPC vs REST: let the battle begin!
gRPC vs REST: let the battle begin!gRPC vs REST: let the battle begin!
gRPC vs REST: let the battle begin!Alex Borysov
 
"gRPC-Web: It’s All About Communication": Devoxx Belgium 2019
"gRPC-Web: It’s All About Communication": Devoxx Belgium 2019"gRPC-Web: It’s All About Communication": Devoxx Belgium 2019
"gRPC-Web: It’s All About Communication": Devoxx Belgium 2019Alex Borysov
 
"gRPC-Web: It’s All About Communication": Devoxx Ukraine 2019
"gRPC-Web:  It’s All About Communication": Devoxx Ukraine 2019"gRPC-Web:  It’s All About Communication": Devoxx Ukraine 2019
"gRPC-Web: It’s All About Communication": Devoxx Ukraine 2019Alex Borysov
 
"gRPC-Web: It’s All About Communication": Devoxx Ukraine 2019
"gRPC-Web: It’s All About Communication": Devoxx Ukraine 2019"gRPC-Web: It’s All About Communication": Devoxx Ukraine 2019
"gRPC-Web: It’s All About Communication": Devoxx Ukraine 2019Alex Borysov
 
"Enabling Googley microservices with gRPC" Riga DevDays 2018 edition
"Enabling Googley microservices with gRPC" Riga DevDays 2018 edition"Enabling Googley microservices with gRPC" Riga DevDays 2018 edition
"Enabling Googley microservices with gRPC" Riga DevDays 2018 editionAlex Borysov
 
Cloud Expo Europe 2022 "Break me if you can: practical guide to building faul...
Cloud Expo Europe 2022 "Break me if you can: practical guide to building faul...Cloud Expo Europe 2022 "Break me if you can: practical guide to building faul...
Cloud Expo Europe 2022 "Break me if you can: practical guide to building faul...Alex Borysov
 
REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...
REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...
REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...Vladimir Dejanovic
 
HTTP/3 is next generation HTTP
HTTP/3 is next generation HTTPHTTP/3 is next generation HTTP
HTTP/3 is next generation HTTPDaniel Stenberg
 
common mistakes when using libcurl
common mistakes when using libcurlcommon mistakes when using libcurl
common mistakes when using libcurlDaniel Stenberg
 
2018 IterateConf Deconstructing and Evolving REST Security
2018 IterateConf Deconstructing and Evolving REST Security2018 IterateConf Deconstructing and Evolving REST Security
2018 IterateConf Deconstructing and Evolving REST SecurityDavid Blevins
 
REST API vs gRPC, which one should you use in breaking a monolith [Kdg.net 2018]
REST API vs gRPC, which one should you use in breaking a monolith [Kdg.net 2018]REST API vs gRPC, which one should you use in breaking a monolith [Kdg.net 2018]
REST API vs gRPC, which one should you use in breaking a monolith [Kdg.net 2018]Vladimir Dejanovic
 
JavaLand gRPC vs REST API
JavaLand gRPC vs REST APIJavaLand gRPC vs REST API
JavaLand gRPC vs REST APIVladimir Dejanovic
 
Docker Docker - Docker Security - Docker
Docker Docker - Docker Security - DockerDocker Docker - Docker Security - Docker
Docker Docker - Docker Security - DockerBoyd Hemphill
 
WordPress RESTful API & Amazon API Gateway - WordCamp Kansai 2016
WordPress RESTful API & Amazon API Gateway - WordCamp Kansai 2016WordPress RESTful API & Amazon API Gateway - WordCamp Kansai 2016
WordPress RESTful API & Amazon API Gateway - WordCamp Kansai 2016崇之 清水
 
HTTP/3 for everyone
HTTP/3 for everyoneHTTP/3 for everyone
HTTP/3 for everyoneDaniel Stenberg
 
Http3 fullstackfest-2019
Http3 fullstackfest-2019Http3 fullstackfest-2019
Http3 fullstackfest-2019Daniel Stenberg
 
HTTP/3 in curl 2020
HTTP/3 in curl 2020HTTP/3 in curl 2020
HTTP/3 in curl 2020Daniel Stenberg
 

What's hot (20)

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

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

The spring ecosystem in 50 min
The spring ecosystem in 50 minThe spring ecosystem in 50 min
The spring ecosystem in 50 minJeroen Sterken
 
Managing microservices with istio on OpenShift - Meetup
Managing microservices with istio on OpenShift - MeetupManaging microservices with istio on OpenShift - Meetup
Managing microservices with istio on OpenShift - MeetupJosé Román Martín Gil
 
How Netflix Is Solving Authorization Across Their Cloud
How Netflix Is Solving Authorization Across Their CloudHow Netflix Is Solving Authorization Across Their Cloud
How Netflix Is Solving Authorization Across Their CloudTorin Sandall
 
Deploying Next Gen Systems with Zero Downtime
Deploying Next Gen Systems with Zero DowntimeDeploying Next Gen Systems with Zero Downtime
Deploying Next Gen Systems with Zero DowntimeTwilio Inc
 
HowYourAPIBeMyAPI
HowYourAPIBeMyAPIHowYourAPIBeMyAPI
HowYourAPIBeMyAPIJie Liau
 
Guillotina: The Asyncio REST Resource API
Guillotina: The Asyncio REST Resource APIGuillotina: The Asyncio REST Resource API
Guillotina: The Asyncio REST Resource APINathan Van Gheem
 
Devoxx Belgium 2022 gRPC Cornerstone: HTTP/2… or HTTP/3?
Devoxx Belgium 2022 gRPC Cornerstone: HTTP/2… or HTTP/3?Devoxx Belgium 2022 gRPC Cornerstone: HTTP/2… or HTTP/3?
Devoxx Belgium 2022 gRPC Cornerstone: HTTP/2… or HTTP/3?Alex Borysov
 
OWASPAPISecurity
OWASPAPISecurityOWASPAPISecurity
OWASPAPISecurityJie Liau
 
Serverless and Servicefull Applications - Where Microservices complements Ser...
Serverless and Servicefull Applications - Where Microservices complements Ser...Serverless and Servicefull Applications - Where Microservices complements Ser...
Serverless and Servicefull Applications - Where Microservices complements Ser...Red Hat Developers
 
2018 jPrime Deconstructing and Evolving REST Security
2018 jPrime Deconstructing and Evolving REST Security2018 jPrime Deconstructing and Evolving REST Security
2018 jPrime Deconstructing and Evolving REST SecurityDavid Blevins
 
Building Hypermedia APIs in JavaScript
Building Hypermedia APIs in JavaScriptBuilding Hypermedia APIs in JavaScript
Building Hypermedia APIs in JavaScript3scale
 
Secure Credential Management with CredHub - Eoghan Kelleher
Secure Credential Management with CredHub - Eoghan KelleherSecure Credential Management with CredHub - Eoghan Kelleher
Secure Credential Management with CredHub - Eoghan KelleherVMware Tanzu
 
Day 2 Kubernetes - Tools for Operability (HashiConf)
Day 2 Kubernetes - Tools for Operability (HashiConf)Day 2 Kubernetes - Tools for Operability (HashiConf)
Day 2 Kubernetes - Tools for Operability (HashiConf)bridgetkromhout
 
Building APIs in an easy way using API Platform
Building APIs in an easy way using API PlatformBuilding APIs in an easy way using API Platform
Building APIs in an easy way using API PlatformAntonio Peric-Mazar
 
Serverless and serverfull - where microservices compliments serverless
Serverless and serverfull - where microservices compliments serverlessServerless and serverfull - where microservices compliments serverless
Serverless and serverfull - where microservices compliments serverlessJudy Breedlove
 
Ibm_interconnect_restapi_workshop
Ibm_interconnect_restapi_workshopIbm_interconnect_restapi_workshop
Ibm_interconnect_restapi_workshopShubhra Kar
 
Building Serverless applications with Python
Building Serverless applications with PythonBuilding Serverless applications with Python
Building Serverless applications with PythonAndrii Soldatenko
 
8 Lessons Learned from Using Kafka in 1500 microservices - confluent streamin...
8 Lessons Learned from Using Kafka in 1500 microservices - confluent streamin...8 Lessons Learned from Using Kafka in 1500 microservices - confluent streamin...
8 Lessons Learned from Using Kafka in 1500 microservices - confluent streamin...Natan Silnitsky
 
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Natan Silnitsky
 
DevSecCon Singapore 2018 - in graph we trust By Imran Mohammed
DevSecCon Singapore 2018 - in graph we trust By Imran MohammedDevSecCon Singapore 2018 - in graph we trust By Imran Mohammed
DevSecCon Singapore 2018 - in graph we trust By Imran MohammedDevSecCon
 

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

The spring ecosystem in 50 min
The spring ecosystem in 50 minThe spring ecosystem in 50 min
The spring ecosystem in 50 min
 
Managing microservices with istio on OpenShift - Meetup
Managing microservices with istio on OpenShift - MeetupManaging microservices with istio on OpenShift - Meetup
Managing microservices with istio on OpenShift - Meetup
 
How Netflix Is Solving Authorization Across Their Cloud
How Netflix Is Solving Authorization Across Their CloudHow Netflix Is Solving Authorization Across Their Cloud
How Netflix Is Solving Authorization Across Their Cloud
 
Deploying Next Gen Systems with Zero Downtime
Deploying Next Gen Systems with Zero DowntimeDeploying Next Gen Systems with Zero Downtime
Deploying Next Gen Systems with Zero Downtime
 
HowYourAPIBeMyAPI
HowYourAPIBeMyAPIHowYourAPIBeMyAPI
HowYourAPIBeMyAPI
 
Guillotina: The Asyncio REST Resource API
Guillotina: The Asyncio REST Resource APIGuillotina: The Asyncio REST Resource API
Guillotina: The Asyncio REST Resource API
 
Devoxx Belgium 2022 gRPC Cornerstone: HTTP/2… or HTTP/3?
Devoxx Belgium 2022 gRPC Cornerstone: HTTP/2… or HTTP/3?Devoxx Belgium 2022 gRPC Cornerstone: HTTP/2… or HTTP/3?
Devoxx Belgium 2022 gRPC Cornerstone: HTTP/2… or HTTP/3?
 
OWASPAPISecurity
OWASPAPISecurityOWASPAPISecurity
OWASPAPISecurity
 
Serverless and Servicefull Applications - Where Microservices complements Ser...
Serverless and Servicefull Applications - Where Microservices complements Ser...Serverless and Servicefull Applications - Where Microservices complements Ser...
Serverless and Servicefull Applications - Where Microservices complements Ser...
 
2018 jPrime Deconstructing and Evolving REST Security
2018 jPrime Deconstructing and Evolving REST Security2018 jPrime Deconstructing and Evolving REST Security
2018 jPrime Deconstructing and Evolving REST Security
 
Building Hypermedia APIs in JavaScript
Building Hypermedia APIs in JavaScriptBuilding Hypermedia APIs in JavaScript
Building Hypermedia APIs in JavaScript
 
Secure Credential Management with CredHub - Eoghan Kelleher
Secure Credential Management with CredHub - Eoghan KelleherSecure Credential Management with CredHub - Eoghan Kelleher
Secure Credential Management with CredHub - Eoghan Kelleher
 
Day 2 Kubernetes - Tools for Operability (HashiConf)
Day 2 Kubernetes - Tools for Operability (HashiConf)Day 2 Kubernetes - Tools for Operability (HashiConf)
Day 2 Kubernetes - Tools for Operability (HashiConf)
 
Building APIs in an easy way using API Platform
Building APIs in an easy way using API PlatformBuilding APIs in an easy way using API Platform
Building APIs in an easy way using API Platform
 
Serverless and serverfull - where microservices compliments serverless
Serverless and serverfull - where microservices compliments serverlessServerless and serverfull - where microservices compliments serverless
Serverless and serverfull - where microservices compliments serverless
 
Ibm_interconnect_restapi_workshop
Ibm_interconnect_restapi_workshopIbm_interconnect_restapi_workshop
Ibm_interconnect_restapi_workshop
 
Building Serverless applications with Python
Building Serverless applications with PythonBuilding Serverless applications with Python
Building Serverless applications with Python
 
8 Lessons Learned from Using Kafka in 1500 microservices - confluent streamin...
8 Lessons Learned from Using Kafka in 1500 microservices - confluent streamin...8 Lessons Learned from Using Kafka in 1500 microservices - confluent streamin...
8 Lessons Learned from Using Kafka in 1500 microservices - confluent streamin...
 
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
 
DevSecCon Singapore 2018 - in graph we trust By Imran Mohammed
DevSecCon Singapore 2018 - in graph we trust By Imran MohammedDevSecCon Singapore 2018 - in graph we trust By Imran Mohammed
DevSecCon Singapore 2018 - in graph we trust By Imran Mohammed
 

Recently uploaded

(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Service
(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Service(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Service
(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Serviceranjana rawat
 
Introduction to Multiple Access Protocol.pptx
Introduction to Multiple Access Protocol.pptxIntroduction to Multiple Access Protocol.pptx
Introduction to Multiple Access Protocol.pptxupamatechverse
 
chaitra-1.pptx fake news detection using machine learning
chaitra-1.pptx  fake news detection using machine learningchaitra-1.pptx  fake news detection using machine learning
chaitra-1.pptx fake news detection using machine learningmisbanausheenparvam
 
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escortsranjana rawat
 
Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝
Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝
Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝soniya singh
 
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur High Profile
 
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptx
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptxDecoding Kotlin - Your guide to solving the mysterious in Kotlin.pptx
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptxJoĂŁo Esperancinha
 
College Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
College Call Girls Nashik Nehal 7001305949 Independent Escort Service NashikCollege Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
College Call Girls Nashik Nehal 7001305949 Independent Escort Service NashikCall Girls in Nagpur High Profile
 
Introduction and different types of Ethernet.pptx
Introduction and different types of Ethernet.pptxIntroduction and different types of Ethernet.pptx
Introduction and different types of Ethernet.pptxupamatechverse
 
Processing & Properties of Floor and Wall Tiles.pptx
Processing & Properties of Floor and Wall Tiles.pptxProcessing & Properties of Floor and Wall Tiles.pptx
Processing & Properties of Floor and Wall Tiles.pptxpranjaldaimarysona
 
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...ranjana rawat
 
SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )Tsuyoshi Horigome
 
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...Dr.Costas Sachpazis
 
Coefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptxCoefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptxAsutosh Ranjan
 
Call Girls Delhi {Jodhpur} 9711199012 high profile service
Call Girls Delhi {Jodhpur} 9711199012 high profile serviceCall Girls Delhi {Jodhpur} 9711199012 high profile service
Call Girls Delhi {Jodhpur} 9711199012 high profile servicerehmti665
 
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130Suhani Kapoor
 
HARMONY IN THE NATURE AND EXISTENCE - Unit-IV
HARMONY IN THE NATURE AND EXISTENCE - Unit-IVHARMONY IN THE NATURE AND EXISTENCE - Unit-IV
HARMONY IN THE NATURE AND EXISTENCE - Unit-IVRajaP95
 
MANUFACTURING PROCESS-II UNIT-2 LATHE MACHINE
MANUFACTURING PROCESS-II UNIT-2 LATHE MACHINEMANUFACTURING PROCESS-II UNIT-2 LATHE MACHINE
MANUFACTURING PROCESS-II UNIT-2 LATHE MACHINESIVASHANKAR N
 
Porous Ceramics seminar and technical writing
Porous Ceramics seminar and technical writingPorous Ceramics seminar and technical writing
Porous Ceramics seminar and technical writingrakeshbaidya232001
 

Recently uploaded (20)

(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Service
(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Service(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Service
(RIA) Call Girls Bhosari ( 7001035870 ) HI-Fi Pune Escorts Service
 
Introduction to Multiple Access Protocol.pptx
Introduction to Multiple Access Protocol.pptxIntroduction to Multiple Access Protocol.pptx
Introduction to Multiple Access Protocol.pptx
 
chaitra-1.pptx fake news detection using machine learning
chaitra-1.pptx  fake news detection using machine learningchaitra-1.pptx  fake news detection using machine learning
chaitra-1.pptx fake news detection using machine learning
 
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts
(MEERA) Dapodi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts
 
Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝
Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝
Model Call Girl in Narela Delhi reach out to us at 🔝8264348440🔝
 
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
 
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptx
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptxDecoding Kotlin - Your guide to solving the mysterious in Kotlin.pptx
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptx
 
College Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
College Call Girls Nashik Nehal 7001305949 Independent Escort Service NashikCollege Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
College Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
 
Introduction and different types of Ethernet.pptx
Introduction and different types of Ethernet.pptxIntroduction and different types of Ethernet.pptx
Introduction and different types of Ethernet.pptx
 
Processing & Properties of Floor and Wall Tiles.pptx
Processing & Properties of Floor and Wall Tiles.pptxProcessing & Properties of Floor and Wall Tiles.pptx
Processing & Properties of Floor and Wall Tiles.pptx
 
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
 
SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )SPICE PARK APR2024 ( 6,793 SPICE Models )
SPICE PARK APR2024 ( 6,793 SPICE Models )
 
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
 
Coefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptxCoefficient of Thermal Expansion and their Importance.pptx
Coefficient of Thermal Expansion and their Importance.pptx
 
Roadmap to Membership of RICS - Pathways and Routes
Roadmap to Membership of RICS - Pathways and RoutesRoadmap to Membership of RICS - Pathways and Routes
Roadmap to Membership of RICS - Pathways and Routes
 
Call Girls Delhi {Jodhpur} 9711199012 high profile service
Call Girls Delhi {Jodhpur} 9711199012 high profile serviceCall Girls Delhi {Jodhpur} 9711199012 high profile service
Call Girls Delhi {Jodhpur} 9711199012 high profile service
 
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130
VIP Call Girls Service Kondapur Hyderabad Call +91-8250192130
 
HARMONY IN THE NATURE AND EXISTENCE - Unit-IV
HARMONY IN THE NATURE AND EXISTENCE - Unit-IVHARMONY IN THE NATURE AND EXISTENCE - Unit-IV
HARMONY IN THE NATURE AND EXISTENCE - Unit-IV
 
MANUFACTURING PROCESS-II UNIT-2 LATHE MACHINE
MANUFACTURING PROCESS-II UNIT-2 LATHE MACHINEMANUFACTURING PROCESS-II UNIT-2 LATHE MACHINE
MANUFACTURING PROCESS-II UNIT-2 LATHE MACHINE
 
Porous Ceramics seminar and technical writing
Porous Ceramics seminar and technical writingPorous Ceramics seminar and technical writing
Porous Ceramics seminar and technical writing
 

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