gRPC 比 HTTP/JSON 快多少?字节数少多少?快在什么地方、又在什么地方不快?这篇用 Go 标准库 net/http + encoding/json 对 grpc-go,在同一个 Item 上把字节数、延迟、并发、建连四个维度各比一遍。
小(id、name、count) gRPC:请求 97 + 响应 103 = 200 字节;HTTP/1.1 JSON:请求 227 + 响应 184 = 411 字节(JSON 是 gRPC 的 2.06 倍) 中(+10 个 tag、1 KiB payload) gRPC:请求 1194 + 响应 1200 = 2394 字节;HTTP/1.1 JSON:请求 1674 + 响应 1631 = 3305 字节(JSON 是 gRPC 的 1.38 倍) 大(+64 KiB payload) gRPC:请求 65782 + 响应 65788 = 131570 字节;HTTP/1.1 JSON:请求 87691 + 响应 87667 = 175358 字节(JSON 是 gRPC 的 1.33 倍)
小消息主要差在 HTTP/1.1 每个请求重复发完整的头;大消息差在 JSON 的文本表示和 bytes 的 base64。
小 Item gRPC p50 70 µs、p99 136 µs;HTTP/1.1 JSON p50 72 µs、p99 154 µs(p50 之比 1.04) 64 KiB payload gRPC p50 215 µs、p99 596 µs;HTTP/1.1 JSON p50 357 µs、p99 631 µs(p50 之比 1.66)
小消息的往返延迟两者几乎一样;消息变大之后,JSON 的编解码和 base64 让延迟明显变长。
gRPC,1 条连接: 90024 请求/秒,p50 667 µs HTTP/1.1 JSON, 1 条连接: 16484 请求/秒,p50 3824 µs HTTP/1.1 JSON,64 条连接: 87007 请求/秒,p50 549 µs
HTTP/1.1 一条连接上一次只有一个请求在途,要用很多条连接换并发;gRPC 靠 HTTP/2 多路复用,一条连接就够。
gRPC:新连接 + 第一次请求 p50 256 µs;HTTP/1.1 JSON:p50 146 µs
gRPC 新建连接比 HTTP/1.1 慢一些,不适合每个请求新建一个连接。以上都是同一台机器、回环网络上 Go 对 Go 的比较,不是普遍结论。