相对 gRPC, JSON-RPC:
最后问一下, 有根据文件生成各大语言 JSON 代码的命令行工具吗?
1 julyclyde 2023-02-24 09:46:01 +08:00 ![]() 说白了 gRPC 并不是给人类用的啊,你这个所谓简单透明、可读性其实没啥用 封装切换开销,json 并不占优 |
![]() | 2 chendy 2023-02-24 09:48:05 +08:00 一个序列化二进制,一个序列化文本 侧重点就不一样,没法比 |
![]() | 3 tool2d 2023-02-24 09:48:59 +08:00 一个文本协议,另一个二进制协议,完全不一样的东西。 |
![]() | 4 sadfQED2 2023-02-24 09:50:18 +08:00 via Android 编解码性能差远了,你不在乎这点性能当然无脑 json 啊。高并发场景下 json 编解码动不动就干满 cpu |
![]() | 5 MIUIOS 2023-02-24 09:50:55 +08:00 emmm json 不是更重吗 而且这个就是给机器看的 |
6 DefoliationM 2023-02-24 09:51:47 +08:00 ![]() 我们真的需要 HTTP 协议吗,现在感觉 HTTP 协议就是一坨狗屎,不如 rpc 直观方便 |
![]() | 7 changnet 2023-02-24 09:51:51 +08:00 ![]() json 的序列化性能和 protobuf 的序列化性能(效率和包大小)不是同一个级别的吧,如果对性能不高,用 json 可读性当然更高 |
8 yty2012g 2023-02-24 09:57:22 +08:00 ![]() 我怎么觉得你这三点都不是基于 json 的 rpc 的优点呀... 1. grpc 用的 pb 的协议描述文件怎么看也比 json 更加明确和透明,json 的类型不够丰富 2. 序列化大 JSON 字符串的 CPU 开销是巨大的,代价远比 pb 的序列化要高。 3. 可读性方面,pb 也可以将对象直接打印出来啊,当然你说要通过抓包的时候就能直接从二进制看出数据内容,那确实 JSON 更好,只不过一般不是这么玩的 |
9 julyclyde 2023-02-24 10:01:29 +08:00 @DefoliationM 所以后来 http 也不文本了 |
![]() | 11 mcfog 2023-02-24 10:02:42 +08:00 ![]() 关于最后一个问题,我推荐一个支持生成各大语言 JSON 代码的命令行工具:protoc |
![]() | 12 aladdinding 2023-02-24 10:07:04 +08:00 是的 我们需要 |
13 28Sv0ngQfIE7Yloe 2023-02-24 10:08:58 +08:00 你的场景是不是序列化性能不敏感啊 |
&nbp; 14 DamonLin 2023-02-24 10:09:29 +08:00 还是看场景吧 |
![]() | 15 kongkongyzt 2023-02-24 10:14:33 +08:00 主要是性能,有的场景是对性能和实时性比较敏感的,比如交易 |
![]() | 16 lujiaxing 2023-02-24 10:23:39 +08:00 当然需要. 比如你们这些不做 Java 的, 想找一个类似 Dubbo 的服务间通信 RPC 组件要用什么呢? 如果是 .NET 框架的话除了 ABP 以外就只能用 protobuf-net 了. 还有涉及到高并发场景下本来就是要尽量减少传输体积. 这种情况下不用 gRPC 用什么, 用 JSON 么? 还是 WCF / RMI ? |
17 julyclyde 2023-02-24 10:25:25 +08:00 不过 gRPC 也可以换编码的吧 有人试过 json 吗?体验怎么样? |
18 Logtous 2023-02-24 10:26:25 +08:00 ![]() 貌似 MessagePack 挺符合 op 的要求 |
![]() | 19 Maboroshii 2023-02-24 10:33:08 +08:00 grpc 除了编码默认是 protobuf 以外,它还跨平台跨语言。 如果不用跨语言,可以随便找个开源的 rpc 框架用了,不过我看 golang 的 rpc 框架,基本都支持了 pb ,而且吞吐都比 grpc 高。 |
![]() | 21 fioncat 2023-02-24 10:35:43 +08:00 当你们公司的 QPS 上去之后,就会发现序列化是个很大的性能瓶颈。 当然,低业务量的时候无所谓,哪个舒服用哪个。 |
22 duke807 2023-02-24 10:38:24 +08:00 via Android MessagePack +1024 |
![]() | 25 wanguorui123 2023-02-24 10:46:28 +08:00 为了通用性还是 HTTP-JSON 靠谱 |
![]() | 27 Nazz OP @Maboroshii gRPC 性能方面确实不占优势, HTTP1.1+PB 在内网也能达到非常高的 IOPS |
30 mafanding 2023-02-24 11:14:24 +08:00 我也有个疑惑 按理说发明 grpc 是为了在内部服务之间更高效的调用,那么为什么现在的微服务还要加 tls 层 |
33 AugOmin 2023-02-24 11:21:12 +08:00 我是用了 grpc 的双向 steam ,在 http2.0 里面 grpc 算是比较常用的,之前还试过 websocket 实现双向 steam ,比 grpc 的 steam 开箱即用程度还是差不少 |
![]() | 37 idblife 2023-02-24 13:23:16 +08:00 grpc 用来翻墙都比其它要快。。。 |
39 Goat121 2023-02-24 14:59:46 +08:00 既然性能要求无所谓,还用啥 JSON-RPC ,直接 http 不是更简单更通用 |
![]() | 40 documentzhangx66 2023-02-24 15:26:44 +08:00 可读性、可调试性,HTTP-JSON 方案完胜。 性能,gRPC 完胜。 有钱上 HTTP-JSON ,没钱上 gRPC 。就像有钱上虚拟机,没钱上 docker 一样。 |
![]() | 41 tool2d 2023-02-24 15:34:17 +08:00 @Nazz "要是我的话会选择 WebSocket, 因为我对 ws 非常的熟悉." 我也对 ws 比较熟悉,但是 ws 并不算一个好协议。 一开始我们都是文本传输,后来数据量上去了,发现 ws 的文本压缩协议竟然是扩展协议?并不是每一个客户端都能顺利支持扩展的。 折腾来折腾去,为了最佳兼容性,只能从文本变成二进制压缩。最后 ws 沦落为一个普通的长连接 socket 来使用。 |
![]() | 42 guonaihong 2023-02-24 15:46:58 +08:00 "协议方面更加统一, 没有封装和切换的开销, 中间件可以复用" 通信层面是 http 还是 tlv 包装一个私有协议? |
![]() | 43 Nazz OP @tool2d 好像压缩这块早期挺乱的, 现在都是 permessage-deflate 了. 追求最佳兼容性, 可以在服务端关闭拓展, 自行压缩解压. 开箱即用方面确实不如 gRPC, 强在简单透明, 兼容性更好. 我自己为 ws 写了个 api router 提供 header 元数据和中间件路由组, 有兴趣可以看看: https://github.com/lxzan/uRouter . |
![]() | 44 Nazz OP @guonaihong 我指的是对内对外统一使用 HTTP JSON-RPC. |
![]() | 45 sophos 2023-02-24 16:38:31 +08:00 用上 gRPC 你根本就不用关心编码后的数据长啥样,线上查 bug 看日志不是挺好嘛,线下 debug 就更不用说了 欢迎看看这个 Go 微服务框架,基于 protobuf 自动生成 HTTP+gRPC 接口,一套代码可以同时实现 HTTP 及 gRPC :-) https://github.com/douyu/jupiter-layout |
![]() | 46 Nazz OP @documentzhangx66 有很多高性能的 JSON 实现, 除浮点数外, 和 protobuf 差距不是特别大. |
47 securityCoding 2023-02-24 19:35:52 +08:00 异构系统用 grpc 舒服一点吧 |
48 aper 2023-02-24 19:40:29 +08:00 @Nazz 差多了,pb 是 tlv 的结构,json 还要处理不同符号,性能完全不在一个档次上。很多技术文档会为了显示自己牛逼,在某几个特定场景展现自己的优势,具体还得自己测测。 |
49 rocmax 2023-02-24 19:47:29 +08:00 后端微服务之间追求效率的话用 grpc,因为 json 里很大比例是括号。 前端的话 grpc 也不能直接用,相对于传输效率,前后协作方面的需求更大一些。 graphql ,trpc 都提供了 api 的信息和类型约束。restful 的话就只能靠 openapi 约定。 json rpc 看不到任何优势。 |
![]() | 50 BrettD 2023-02-24 20:51:41 +08:00 via iPhone 有些类型不是 JSON 可以原生表达的 |
51 winRain 2023-02-24 21:32:48 +08:00 我一直看到说 grpc 性能比 json 强很多,适合高并发。我是一直没用过 grpc ,但是想问问各位大佬,性能大概是强多少,你们大概并发多少的时候 grpc 会比 json 强?有愿意解答的吗 |
52 fox0001 2023-02-24 21:58:56 +08:00 ![]() 看了下,貌似结论是“我们需要 gRPC” |
![]() | 53 lesismal 2023-02-24 22:23:33 +08:00 ![]() 1. Body size:json 字节数包含引号逗号方括号花括号、key 这些,字节数远大于 pb ,所以流量更浪费、对应的网络时间消耗也大一些 2. Codec:即使高性能的实现,通常后端相同语言 codec 性能也比 pb 差 json 胜在自释,更灵活;但是其他 rpc 也可以使用 pb ,比如 http+pb+rpc 3. Transport:grpc 绑定了 HTTP2.0 ; json rpc 可以用 tcp 或者其他可靠的协议,如果内网无所谓安全可以使用 4 层的 tcp ,json rpc 在 transport 这层上的消耗比 grpc 节省很多,性能可能更快 4. 工程性:强类型结构化,工程更规范。pb 默认这样子了,json 也可以工程规范约束使用强类型结构化,也可以规范 单说 grpc 的话,我觉得谷歌挺坑的。HTTP2.0 没有解决 4 层 TCP 的线头阻塞问题,对于 rpc 场景,多数是内网,直接 tcp 性能和消耗更友好。rpc 的交互模式就是残疾,对于更广阔的领域的交互需求支撑比较麻烦。 我的 arpc 除了多语言支持不够(只支持 golang 和前端 js ),其他各方面都比 grpc 强太多了: 1. transport 可定制,能使用 tcp/tls/kcp/utp/quic/websocket...各种实现了 net.Listener/net.Conn 的协议 2. codec 可定制,能使用 json/pb/msgpack...各种,你想用啥旧用啥 3. 交互方式多种多样,支持的业务场景丰富,除了支持传统 rpc 的 Client Call ,也支持 Client Notify/Server Call/Server Notify ,而且支持 CallAsync ,在这些丰富的交互模式下,可以做推送、IM 、游戏...各种业务 4. 支持中间件,比如你用 gin ,很多中间件,arpc 也可以各种定制 5. 其他扩展,比如你想单机百万连接,可以再基于 nbio 做网络层 6. 性能:请搜索参考鸟窝老师这个文章,三方压测比较客观:”2022 Go 生态圈 rpc 框架 Benchmark“。性能甩 grpc 简直不是一条街的,完全不屑于跟 grpc 比性能... 7. 易用性:3 中列举了支持各种交互模式和业务,使用上也非常简单,就像 golang 标准库 http handler 一样 easy ,不需要像 grpc 那样生成僵硬呆板的代码 8. 异步的粒度:arpc 支持最灵活的异步,请参考这里: https://github.com/lesismal/arpc/issues/41 ... 真的有点不屑于跟其他 rpc 对比了。。。 |
![]() | 54 MOONLIGHTT 2023-02-24 22:40:27 +08:00 ![]() 我们一般用 brpc ,调试的时候可以兼容 json 格式 |
57 WispZhan 只会考虑 Web ,和只写 Web 的程序员有点可怕。 |
![]() | 58 documentzhangx66 2023-02-25 00:07:57 +08:00 |
![]() | 59 lambdaq 2023-02-25 00:12:32 +08:00 gRPC 的点在于类型系统和 schema 迁移方案。。。 别的 RPC 没解决这两个点就没有可比性。 |
65 lolizeppelin 2023-02-25 09:20:03 +08:00 |
![]() | 66 opentrade 2023-02-25 11:40:29 +08:00 你不需要的东西太多了 |
![]() | 67 lambdaq 2023-02-25 12:44:25 +08:00 |
![]() | 69 echoless 2023-02-25 14:31:06 +08:00 |
![]() | 70 sardina 2023-02-25 14:58:27 +08:00 via iPhone 直接用 tcp 吧 |
![]() | 71 Valid 2023-02-25 22:40:49 +08:00 多大体量才要开始考虑这个开销,我要有这个体量宁愿效率换成本 |