03|通信协议:如何设计一个好的通信协议?
- 深入了解
- 翻译
- 解释
- 总结
通信协议在消息队列中扮演着关键角色,其设计需满足高可靠性、低延时、高吞吐等核心特性。本文深入介绍了通信协议的基础知识,包括公有协议和私有协议的区别,以及设计私有协议的三个步骤。文章详细讨论了网络通信协议选型,强调了主流消息队列基于TCP协议的选择。在应用通信协议设计方面,文章提到了协议头和协议体的构成,以Kafka协议为例分析了协议头的设计。此外,还探讨了数据类型、编解码实现以及自定义编解码与使用现成编解码框架的选择。总的来说,本文通过深入浅出的方式介绍了通信协议的重要性和设计原则,为读者提供了对消息队列通信协议的全面了解。 文章强调了消息队列通信协议设计的重要性,包括网络通信协议选型、应用通信协议设计和编解码实现。在应用通信协议设计方面,文章提到了协议头和协议体的构成,以及字段类型的选择和设计技巧。此外,文章还指出了保证协议的向前兼容和向后兼容的能力的重要性。最后,文章提到了消息队列的编解码框架选择,建议在全新项目或架构中使用现成的编解码框架,如Protobuf。整体而言,本文为读者提供了全面的消息队列通信协议设计知识,并强调了设计原则和技巧的重要性。
《深入拆解消息队列 47 讲》,新⼈⾸单¥59
全部留言(18)
- 最新
- 精选
- 张申傲请问老师,如果一款新的消息队列直接采用了gRPC,那么是不是相当于同时具备了网络通信协议(gRPC底层是HTTP2.0)、应用通信协议(Protobuf的IDL定义)和编解码(Protobuf)三种功能,这样实现成本就更低了?
作者回复: 从设计、内核和客户端工作量来看成本肯定是更低的,而且是低非常多。毕竟 GRPC 已经实现了很多的功能,如协议、连接管理、编解码等等复杂的工作。目前RocketMQ 5.0 的Proxy模块用的就是这个方案。有兴趣可以去看一下社区的RIP。https://shimo.im/docs/gXqmeEPYgdUw5bqo 具体降低的工作量比例,可以从我们在微服务架构中自定义实现RPC调用和使用GRPC调用之间的工作量对比,有一个相对直观的感受, 使用GRPC也有缺点: 1. 从性能上来看,GRPC的性能会比原生的基于TCP实现的二进制通信低一些。 2. 另外如果需要对底层进行某些优化(比如连接优化)难度会很大,因为都封装到GRPC的内核中了。调整起来不是那么灵活
2023-06-27归属地:北京26 - 青鸟飞鱼用QUIC协议会不会好一点呢??
作者回复: QUIC协议从技术原理上来看,性能和稳定性是有保证的。但是从业界来看,使用QUIC来通信的开源产品确实比较少,实践落地的较少。所以我个人持保留意见。
2023-07-09归属地:四川23 - 二夕读了本节的内容之后,对于后面的部分愈发感觉到期待。起初读前面的章节还有点比较普通内容有点水的感觉,从这部分来看内容逐渐硬核起来,催更催更!!
作者回复: 做这门课花了我很多时间,我的核心目的是对我这么多年在消息队列领域的积累有一个很好总结。我觉得除了技术相关的,最后一部分的经验总结是我最想写的。 期间,我也拉了很多这个领域的小伙伴来看是否能有收获。从个人的角度来看,我倒是不怕门课是水课,我反而担心这门课挺肝的,大家可能看不下去。 我希望在以后,我自己来看这门课,还能有收获。共勉~
2023-07-06归属地:浙江3 - aoe我觉得「请求头和返回头的协议版本制定,是建议分开定义的」有以下优点: 1. 分离关注点,可降低复杂度 2. 符合单一原则,功能更内聚,设计上对测试友好,有利于编写单元测试 所以这样在后期的维护升级中会更加灵活
作者回复: 是的,所以都是分开的。 通用部分如果每个请求协议都自己设计,工作太繁重了,不符合技术设计的理念。
2023-06-28归属地:浙江3 - 木几丶回答问题:为什么业界的消息队列有多种标准的协议呢? 我觉得是因为每种消息队列功能不同,特点不同,定位不同,都会根据自身的功能特性量身定制一种协议以达到性能、扩展性的最大化,同时也能根据自己的节奏控制版本迭代
作者回复: 是的,完美,我也是这么理解的。
2023-06-28归属地:福建3 - kai通信协议,主要负责客户端和服务端之间的通信。 通信协议的设计要求: 1 可靠性高 2 性能好 3 节省带宽 4 扩展性好 通信协议的设计主要包括三部分: 网络协议的设计:一般选择可靠的 TCP 协议 应用协议的设计:应用协议主要分为两部分,请求和响应。每部分又分为协议头和协议体。 设计原则要求向前和向后兼容,极简以节省带宽,以及注意版本管理。 可以选择使用私有协议,好处是自己控制,可以按需开发,也可以使用通用协议,好处是工作量降低,比如使用 gRPC。 编解码设计:也就是序列化和反序列化。 可以自己实现,也可以选择成熟框架,比如使用 gRPC。
作者回复: 是的,总结的非常到位。 如果我们想设计一个协议,那么围绕着这个答案的主框架去往外扩展细化就可以了。
2023-07-04归属地:上海1 - 翡翠虎看了前面几篇,能猜到后面的内容也很精彩。重点关注分布式协议和实践那部分,加油⛽️跟着老师进步
作者回复: 谢谢~ 一起努力
2023-06-27归属地:广西1 - takumi如果在UDP上实现可靠性会不会好一点?
作者回复: UDP从协议层面来看,它的底层机制的设计就是不可靠的。所以我个人理解,应该是TCP更可靠。
2023-07-06归属地:上海4 - Satroler棒,文强哥请速更
作者回复: 哈哈哈,老哥一起加油
2023-06-27归属地:江苏 - 文敦复3个字,棒棒棒。再来2个字,催更。2023-06-29归属地:四川2