深入拆解消息队列 47 讲
许文强
前腾讯云 Kafka 技术负责人
5385 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
深入拆解消息队列 47 讲
15
15
1.0x
00:00/00:00
登录|注册

03|通信协议:如何设计一个好的通信协议?

你好,我是文强。
今天我们正式进入基础篇的学习,我会带你构建最基础的消息队列。
从功能上来看,一个最基础的消息队列应该具备生产、存储、消费的能力,也就是能完成“生产者把数据发送到 Broker,Broker 收到数据后,持久化存储数据,最后消费者从 Broker 消费数据”的整个流程。
我们从这个流程来拆解技术架构,如下图所示,最基础的消息队列应该具备五个模块。
通信协议:用来完成客户端(生产者和消费者)和 Broker 之间的通信,比如生产或消费。
网络模块:客户端用来发送数据,服务端用来接收数据。
存储模块:服务端用来完成持久化数据存储。
生产者:完成生产相关的功能。
消费者:完成消费相关的功能。
我们知道,消息队列本质上讲是个 CS 模型,通过客户端和服务端之间的交互完成生产、消费等行为。不知道你在日常的开发过程中,是否会好奇客户端和服务端之间的通信流程是怎么实现的呢?
那今天我们就开始学习基础篇的第一讲——通信协议。为了完成交互,我们第一步就需要确定服务端和客户端是如何通信的。而通信的第一步就是确定使用哪种通信协议进行通信。
说到协议,我们开发者最熟悉的可能就是 HTTP 协议了,HTTP 作为一个标准协议,有很多优点。那能否用 HTTP 协议作为消息队列的通信协议呢?带着你的思考,我们开始学习。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

通信协议在消息队列中扮演着关键角色,其设计需满足高可靠性、低延时、高吞吐等核心特性。本文深入介绍了通信协议的基础知识,包括公有协议和私有协议的区别,以及设计私有协议的三个步骤。文章详细讨论了网络通信协议选型,强调了主流消息队列基于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归属地:北京
    2
    6
  • 青鸟飞鱼
    用QUIC协议会不会好一点呢??

    作者回复: QUIC协议从技术原理上来看,性能和稳定性是有保证的。但是从业界来看,使用QUIC来通信的开源产品确实比较少,实践落地的较少。所以我个人持保留意见。

    2023-07-09归属地:四川
    2
    3
  • 二夕
    读了本节的内容之后,对于后面的部分愈发感觉到期待。起初读前面的章节还有点比较普通内容有点水的感觉,从这部分来看内容逐渐硬核起来,催更催更!!

    作者回复: 做这门课花了我很多时间,我的核心目的是对我这么多年在消息队列领域的积累有一个很好总结。我觉得除了技术相关的,最后一部分的经验总结是我最想写的。 期间,我也拉了很多这个领域的小伙伴来看是否能有收获。从个人的角度来看,我倒是不怕门课是水课,我反而担心这门课挺肝的,大家可能看不下去。 我希望在以后,我自己来看这门课,还能有收获。共勉~

    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
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部