Slide 1

Slide 1 text

Sandeep Dinesh Developer Advocate @sandeepdinesh vs {REST}

Slide 2

Slide 2 text

@sandeepdinesh Who has heard of gRPC?

Slide 3

Slide 3 text

@sandeepdinesh Who is using gRPC?

Slide 4

Slide 4 text

@sandeepdinesh Who is using gRPC?

Slide 5

Slide 5 text

5 gRPC REST

Slide 6

Slide 6 text

6 gRPC REST

Slide 7

Slide 7 text

@sandeepdinesh gRPC is basically Protobuf over HTTP/2 POST

Slide 8

Slide 8 text

@sandeepdinesh REST is basically JSON over HTTP 1.1

Slide 9

Slide 9 text

@sandeepdinesh JSON → Protobuf HTTP 1.1→ HTTP/2

Slide 10

Slide 10 text

@sandeepdinesh JSON vs Protobuf plaintext vs binary human readable vs machine readable repetitive vs compressed fast (de)serialization vs faster (de)serialization* Everything supports it vs limited support

Slide 11

Slide 11 text

@sandeepdinesh HTTP 1.1 vs. HTTP/2 plaintext vs binary no pipelining vs native pipelining new connection per request vs persistent TCP connection repetitive vs compressed polling vs streaming Non-secure by default vs TLS by default Everything supports it vs limited support

Slide 12

Slide 12 text

@sandeepdinesh Let’s Benchmark!

Slide 13

Slide 13 text

@sandeepdinesh

Slide 14

Slide 14 text

@sandeepdinesh

Slide 15

Slide 15 text

@sandeepdinesh

Slide 16

Slide 16 text

@sandeepdinesh us-west1-a us-east1-c Data B46 Data B64

Slide 17

Slide 17 text

@sandeepdinesh Make 10,000 “Simultaneous Requests” See how fast the server can process them all

Slide 18

Slide 18 text

@sandeepdinesh https://commons.wikimedia.org/wiki/File:Rabbit_Looks_Surprised_by_Monique_Haen.jpg Rabbit Hole

Slide 19

Slide 19 text

@sandeepdinesh Three endpoints REST Non-Streaming gRPC Bidirectional Streaming gRPC Fast? Faster? Fastest?

Slide 20

Slide 20 text

@sandeepdinesh us-west1-a us-east1-c Node.js Client Node.js Server

Slide 21

Slide 21 text

@sandeepdinesh Node.js is async, but single threaded Go has true multithreading

Slide 22

Slide 22 text

@sandeepdinesh Node.js uses a C driver for gRPC Go uses a native Go driver

Slide 23

Slide 23 text

@sandeepdinesh us-west1-a us-east1-c Go Client Go Server Node.js Client Node.js Server

Slide 24

Slide 24 text

@sandeepdinesh BENCHMARKS https://public.tableau.com/shared/N4YBPFJ7W?:display_count=yes

Slide 25

Slide 25 text

@sandeepdinesh us-west1-a us-east1-c 1

Slide 26

Slide 26 text

@sandeepdinesh us-west1-a us-east1-c 2

Slide 27

Slide 27 text

@sandeepdinesh us-west1-a us-east1-c 2

Slide 28

Slide 28 text

@sandeepdinesh us-west1-a us-east1-c 3

Slide 29

Slide 29 text

@sandeepdinesh Make 10,000 Ping-Pongs over the “same” connection

Slide 30

Slide 30 text

@sandeepdinesh Cheating!

Slide 31

Slide 31 text

@sandeepdinesh 12 Server Methods 12 Client Methods 2 Languages 3 Datacenters

Slide 32

Slide 32 text

@sandeepdinesh gRPC is consistently faster

Slide 33

Slide 33 text

@sandeepdinesh Introducing gRPC into your microservices

Slide 34

Slide 34 text

@sandeepdinesh Clients REST Server v1 REST Server v2 gRPC Server v3 REST REST gRPC??? WTF MATE?

Slide 35

Slide 35 text

@sandeepdinesh 1) Force clients to upgrade or use the old service 2) Create gRPC and REST endpoints for the new service

Slide 36

Slide 36 text

@sandeepdinesh 1) Force clients to upgrade or use the old service 2) Create gRPC and REST endpoints for the new service https://commons.wikimedia.org/wiki/File:Carrot-fb.jpg https://pixabay.com/en/photos/wooden%20stick/ >

Slide 37

Slide 37 text

@sandeepdinesh message Person { enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { string number = 1; PhoneType type = 2; } string name = 1; int32 id = 2; string email = 3; repeated PhoneNumber phone = 4; } { "name": "‘Sandeep’", "id": 123, "email": "‘[email protected]’", "phone": [ { "number": 1234566543, "type": "‘HOME’" }, { "number": 1234566545, "type": "‘MOBILE’" } ] }

Slide 38

Slide 38 text

@sandeepdinesh gRPC Gateway!

Slide 39

Slide 39 text

@sandeepdinesh

Slide 40

Slide 40 text

@sandeepdinesh syntax = "proto3"; package pingpong; service PingPong { rpc SyncPerson (Person) returns (Base64) {} }

Slide 41

Slide 41 text

@sandeepdinesh syntax = "proto3"; package pingpong; import "google/api/annotations.proto"; service PingPong { rpc SyncPerson (Person) returns (Base64) { option (google.api.http) = { post: "/addperson" body: "*" }; } }

Slide 42

Slide 42 text

@sandeepdinesh

Slide 43

Slide 43 text

@sandeepdinesh Bonus: Swagger!

Slide 44

Slide 44 text

@sandeepdinesh REST isn’t “dead”

Slide 45

Slide 45 text

@sandeepdinesh gRPC give you additional capabilities like streaming, consistency, and tooling

Slide 46

Slide 46 text

@sandeepdinesh gRPC Gateway is an easy way to provide backwards compatibility

Slide 47

Slide 47 text

@sandeepdinesh

Slide 48

Slide 48 text

@sandeepdinesh Use HTTP/2 There is no excuse!

Slide 49

Slide 49 text

@sandeepdinesh Thanks! gRPC: grpc.io gRPC Gateway: github.com/grpc-ecosystem/grpc-gateway Benchmark Charts: public.tableau.com/profile/sandeep.dinesh