深入研究消息队列01 协议和网络设计
  dBFTbkVLMBge 2023年11月02日 35 0

一、消息队列技术趋势

  早年业界消息队列演进的主要推动力在于功能(如延迟消息、事务消息、顺序消息等)、场景(实时场景、大数据场景等)、分布式集群的支持等等。近几年,随着云原生架构和 Serverless 的普及,业界 MQ 主要向实时消息和流消息的融合架构、Serverless、Event、协议兼容等方面演进。从而实现计算、存储的弹性,实现集群的 Serverless 化。

二、业界主流消息队列

当时有个业务背景:用户的回复会包含图片和表情等复杂结构数据,导致内容可能会特别长。另外遇到高峰时,回帖数量会特别多,短时间内可能有几千万的回帖,回帖的总内容很大。

Redis 的问题在于数据都存在内存里,如果数据没有及时消费,就会打爆内存。而且因为回帖内容可能很大,在 Redis 的 Value 里存大的数据会有性能和稳定性问题。而 MySQL 在 insert 上是有性能瓶颈的,短时间内大量回帖,插入会特别频繁,性能就扛不住。

而 Kafka 就没有这个问题,作为一个消息队列,它的特点就是高吞吐、大消息、高并发、持久化,不会存在性能、功能、稳定性方面的问题。这就是我们选择 Kafka 的理由。

其实如果没有大消息和大流量等复杂场景,是可以选用非标准消息队列产品的。比如在用户状态审核的场景中,只需要向下游传递用户 ID 和审核结果,结构简单,数量有限。这时候选择非标准消息队列比如 Redis 和 MySQL 也是可以的。

所以,是否选择使用标准消息队列产品,取决于你的数据和业务场景的需求。当数据量大、场景复杂后,才必须引入标准消息队列,因为它有高吞吐、持久化、长久堆积的特性。

从宏观上来讲,我会认为具有缓冲作用、具备类发布和订阅能力的存储引擎都可以称做消息队列。因为消息队列的最基本功能就是生产和消费,在发布订阅之上,扩展如死信队列、顺序消息、延时消息等高阶能力,并实现高吞吐、低延时、高可靠等特性,就成为了我们所熟知的功能齐全的标准消息队列。

RabbitMQ 是 2007 年由国外一家叫做 Rabbit 的公司开源的,用 Erlang 写成的消息队列。主要满足业务中消息总线的场景。特点是功能丰富,低流量下稳定性较高,基本具备消息队列所应该具备的所有功能。缺点是在大流量的情况下会有明显的瓶颈和稳定性风险。

RocketMQ 在定位上和 RabbitMQ 很像,功能丰富,在业务消息中经常会用到。不过 RocketMQ 是在移动互联网浪潮下发展起来的,业务场景更加复杂,也支持更多功能,比如消息 Tag、消息轨迹、消息查询等等。

除了功能层面,在架构和性能层面,RabbitMQ 开发设计早,当时分布式的设计理念还不成熟,导致它在架构层面的设计存在较大的缺陷,遇到大流量、高并发的时候,容易出现集群不可用、网络分区等情况无法解决。而 RocketMQ 在分布式架构上实现得更合理优雅,在大流量、高并发的场景下表现优秀稳定。

Pulsar 和 Kafka 很像,主要定位在流领域,主打大吞吐的流式计算。但 Kafka 的功能比较简单,支持基本的发布订阅、幂等、事务消息。Pulsar 在满足这些功能的基础上,也希望支持 RocketMQ 和 RabbitMQ 的功能,所以功能最丰富。

除了功能层面,在架构和性能层面上,Pulsar 的架构设计比 Kafka 更符合当前云原生架构,它的定位是 Kafka 的升级版,主要解决 Kafka 当前的一些痛点问题,比如集群扩缩容慢、分区迁移需要 Rebalance、无法支持超多分区等。性能目前没有特别大的差距。

深入研究消息队列01 协议和网络设计_消息队列

深入研究消息队列01 协议和网络设计_消息队列_02

基于云原生架构设计的 Pulsar 开始走向成熟,业界的 MQ 也出现了计算存储分离、分层存储、多租户、弹性计算等概念。

深入研究消息队列01 协议和网络设计_消息队列_03

三、消息队列的架构和功能

在系统架构中,消息队列的定位就是总线和管道,主要起到解耦上下游系统、数据缓存的作用。它不像数据库,会有很多计算、聚合、查询的逻辑,它的主要操作就是生产和消费。所以,我们在业务中不管是使用哪款消息队列,我们的核心操作永远是生产和消费数据。

深入研究消息队列01 协议和网络设计_消息队列_04

下单流程是一个典型的系统解耦、消息分发的场景,一份数据需要被多个下游系统处理。另外一个经典场景就是日志采集流程,一般日志数据都很大,直接发到下游,下游系统可能会扛不住崩溃,所以会把数据先缓存到消息队列中。所以消息队列的基本特性就是高性能、高吞吐、低延时

消息队列架构

深入研究消息队列01 协议和网络设计_消息队列_05

深入研究消息队列01 协议和网络设计_消息队列_06

深入研究消息队列01 协议和网络设计_消息队列_07

深入研究消息队列01 协议和网络设计_消息队列_08

消息队列功能

深入研究消息队列01 协议和网络设计_消息队列_09

深入研究消息队列01 协议和网络设计_消息队列_10

深入研究消息队列01 协议和网络设计_消息队列_11

深入研究消息队列01 协议和网络设计_消息队列_12

四、如何设计一个好的通信协议

深入研究消息队列01 协议和网络设计_消息队列_13

深入研究消息队列01 协议和网络设计_消息队列_14

深入研究消息队列01 协议和网络设计_消息队列_15

深入研究消息队列01 协议和网络设计_消息队列_16

深入研究消息队列01 协议和网络设计_消息队列_17

深入研究消息队列01 协议和网络设计_消息队列_18

深入研究消息队列01 协议和网络设计_消息队列_19

深入研究消息队列01 协议和网络设计_消息队列_20

深入研究消息队列01 协议和网络设计_消息队列_21

设计的原则是:请求维度的通用信息放在协议头,消息维度的信息就放在协议体。那具体怎么设计呢?我们结合 Kafka 协议来分析。

深入研究消息队列01 协议和网络设计_消息队列_22

深入研究消息队列01 协议和网络设计_消息队列_23

深入研究消息队列01 协议和网络设计_消息队列_24

深入研究消息队列01 协议和网络设计_消息队列_25

深入研究消息队列01 协议和网络设计_消息队列_26

深入研究消息队列01 协议和网络设计_消息队列_27

深入研究消息队列01 协议和网络设计_消息队列_28

深入研究消息队列01 协议和网络设计_消息队列_29

深入研究消息队列01 协议和网络设计_消息队列_30

深入研究消息队列01 协议和网络设计_消息队列_31

深入研究消息队列01 协议和网络设计_消息队列_32

gRPC 的生产消息的请求结构,内容简单,只需要定义生产请求需要携带的相关信息,比如 Topic、用户属性、系统属性等

对比上面两段代码,我们可以很直观地看到区别,gRPC 的协议结构比 Remoting 的协议结构简单很多,比如不需要定义消息头,定义方式也更加简单。

深入研究消息队列01 协议和网络设计_消息队列_33

五、消息队列的网络设计

网络模块的性能瓶颈分析

深入研究消息队列01 协议和网络设计_消息队列_34

深入研究消息队列01 协议和网络设计_消息队列_35

深入研究消息队列01 协议和网络设计_消息队列_36

高性能网络模块的设计实现

深入研究消息队列01 协议和网络设计_消息队列_37

因为语言特性、历史背景原因,RabbitMQ 用的就是这种方案

深入研究消息队列01 协议和网络设计_消息队列_38

深入研究消息队列01 协议和网络设计_消息队列_39

深入研究消息队列01 协议和网络设计_消息队列_40

深入研究消息队列01 协议和网络设计_消息队列_41

深入研究消息队列01 协议和网络设计_消息队列_42

深入研究消息队列01 协议和网络设计_消息队列_43

深入研究消息队列01 协议和网络设计_消息队列_44

深入研究消息队列01 协议和网络设计_消息队列_45

深入研究消息队列01 协议和网络设计_消息队列_46

深入研究消息队列01 协议和网络设计_消息队列_47

深入研究消息队列01 协议和网络设计_消息队列_48

深入研究消息队列01 协议和网络设计_消息队列_49

深入研究消息队列01 协议和网络设计_消息队列_50

深入研究消息队列01 协议和网络设计_消息队列_51

深入研究消息队列01 协议和网络设计_消息队列_52

而 Netty 就是这样一个基于 Java NIO 封装的成熟框架。所以我们一提到 Java 的网络编程,最先想到的就是 Netty。当前业界主流消息队列 RocketMQ、Pulsar 也都是基于 Netty 开发的网络模块,Kafka 因为历史原因是基于 Java NIO 实现的。

主流消息队列的网络模型实现

深入研究消息队列01 协议和网络设计_消息队列_53

深入研究消息队列01 协议和网络设计_消息队列_54

深入研究消息队列01 协议和网络设计_消息队列_55

深入研究消息队列01 协议和网络设计_消息队列_56

深入研究消息队列01 协议和网络设计_消息队列_57

深入研究消息队列01 协议和网络设计_消息队列_58

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

dBFTbkVLMBge