gRPC为什么比基于JSON的REST API快

两个主要原因。

看了不少关于REST与JSON和gRPC的性能基准测试。其中一些测试显示,gRPC将每个请求的延迟减少了一半。

那么,它为什么这么快呢?🤔

⚡ 第一个原因是HTTP/2。

HTTP/1.1的请求和响应是同步的,一次只能处理一个请求。而HTTP/2请求是异步的,可以同时发送多个请求,不需要等待前一个请求的响应。减少了等待前一个请求完成的时间,同时连接复用,也避免了TCP和TLS握手的时间。

这对gRPC来说是一个重要因素,因为gRPC在底层利用了HTTP/2协议。

虽然对用户来说可能看起来只是简单的RPC调用,但它在底层使用的是HTTP。

📦 第二个原因是Protobuf。

HTTP/2 + JSON本身就可以相当快,但使用Protobuf代替JSON可以进一步推动性能提升。

像JSON一样,Protobuf是一种用于交换数据的结构化消息格式,但最大的不同是Protobuf是基于二进制的。

作为基于二进制的,Protobuf在网络传输数据时更加紧凑。

以下是一个简单的对比示例。

假设我们有一个表示用户信息的结构:

{
  "id": 12345,
  "name": "Alice",
  "email": "alice@example.com",
  "isAdmin": true,
  "scores": [85, 92, 88]
}

对应的 Protobuf 定义如下:

syntax = "proto3";

message User {
  int32 id = 1;
  string name = 2;
  string email = 3;
  bool isAdmin = 4;
  repeated int32 scores = 5;
}

数据编码后的对比

我们将上述数据分别序列化为 JSON 和 Protobuf,得到如下结果:

  1. JSON 格式

序列化后的 JSON 数据如下(未压缩):

{
  "id": 12345,
  "name": "Alice",
  "email": "alice@example.com",
  "isAdmin": true,
  "scores": [85, 92, 88]
}

JSON 字符串的总大小为 115 字节。

  1. Protobuf 格式

序列化后的 Protobuf 数据(二进制形式,无法直接阅读,但可以解析为字节数组表示):

08 b9 60 12 05 41 6c 69 63 65 1a 12 61 6c 69 63 65 40 65 78 61 6d 70 6c 65 2e 63 6f 6d 20 01 2a 03 55 5c 58

Protobuf 字节数组的总大小为 37 字节。

JSON采用了文本格式,包含大量描述性的标签(如 "id"、"name" 等)以及符号(如引号、逗号等),如果有json字符串的嵌套可能还有一堆的斜杠。而二进制格式,无需描述性标签,仅包含数据和简洁的字段标识符(字段 ID)。

Protobuf 使用二进制编码和字段号(如 id = 1)来标识数据,而 JSON 使用键值对字符串描述数据结构,增加了额外开销。所以,Protobuf 的数据大小显著小于 JSON,尤其是字段较多、数据量较大时,差距会更明显。

因此,在带宽敏感或高性能需求的场景中,Protobuf 优势突出。

而且Protobuf在序列化和反序列化过程中也比JSON快得多。据测试显示Protobuf 序列化速度比 JSON 快 10 到 100 倍。

格式 序列化时间(毫秒) 反序列化时间(毫秒) 序列化/反序列化次数每秒
JSON 180ms 160ms 5556
Protobuf 16ms 8ms 62500

JSON 需要解析文本中的每个字符,尤其是长字符串和数字字段时,会面临较高的开销。解析 JSON 数据时,必须将文本解析为原始数据类型,并且每次解析时需要处理字符串键名、符号(如括号、逗号等),这比直接解析二进制数据慢得多。

因此,Protobuf不仅传输速度更快,而且处理速度也更快。

💎 但性能并非没有代价。

虽然gRPC有很多优势,甚至超越了性能,它也带来了一些复杂性。

🔀 复杂性:负载分配

和HTTP/2一样,gRPC默认会为多个请求重用连接。如果主要依赖基于连接的负载均衡,这种多路复用可能导致负载分配不均衡。

使用第七层负载均衡器或客户端负载均衡可以解决这个问题,但需要考虑这一点。

🧰 复杂性:故障排除

虽然用于故障排除gRPC服务的工具集正在增长,但它仍然不如REST + JSON那样容易。

gRPC使得执行临时请求、捕获和调试有效载荷、验证端点等变得更加困难。

📄 复杂性:契约

Protobuf的一个优势是清晰的契约。每个人都使用相同的proto文件来生成序列化和反序列化的包。

这种方法很棒,因为它消除了误解,但在分发和版本控制该文件时可能会变得复杂,尤其是当试图将其分发给外部用户时。

💡 总结

如果你需要性能提升,或者你的环境能够处理gRPC带来的复杂性,那么gRPC是一个很好的方法。

如果你对REST + JSON感到满意,并且对gRPC的复杂性感到困扰,那也没关系;REST依然很多人在使用。

本文由mdnice多平台发布

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容