其他分享
首页 > 其他分享> > MQ系列3:RocketMQ 架构分析

MQ系列3:RocketMQ 架构分析

作者:互联网


MQ系列1:消息中间件执行原理
MQ系列2:消息中间件的技术选型

1 背景

我们前面两篇对主流消息队列的基本构成和技术选型做了详细的分析。从本篇开始,我们会专注当下主流MQ之一的RocketMQ。
从他的如下的几个方面去讨论:

参考 MQ系列2:消息中间件的技术选型

1.1 RocketMQ是的基本组件构成

RocketMQ主要有四大核心组成部分:NameServer、Broker、Producer以及Consumer四部分。

另外其他如 Topic、 Message,也是重要的组成部分:

2 RocketMQ 消息架构的演进过程

2.1 简单的生产消费模式

根据我们前面所学的内容,消息队列很重要的一个工作就是对生产和消费者进行解耦的过程。有人负责生产,有人负责消费,两者没有直接交互,交给中介者去处理。
比如说系统A会交给系统B去处理一些事情,但是A不想直接跟B有关联,避免耦合太强,就可以通过在A,B中间加入消息队列,A将要任务的事情交给消息队列 ,B订阅消息队列来执行任务。
这种典型的模式是由两个线程和一个队列构成:

目前这种还只是初级版本的 生产-消费者模式,构成了基本的消息队列 。另外为了消息队列的可用性,我们一般会把消费者,队列,生产者放到不同的服务机上,变成分布式消息队列,这样哪怕消费者所在的主机挂了,依旧不影响消息生产。

2.2 Topic模式对消息进行归类

主题(Topic)可以看做消息的归类,我们将消息进行类型划分,相同类型的消息称为一个 Topic。比如我们在淘宝或京东上购买商品的的过程,就可能产生:购物车消息、交易消息、物流消息等,1条消息必然归属于1个 Topic 。
1个 Topic可以有0 ~ n 个生产者向其发送消息;也可以被 0~n 个消费者订阅和处理,于是就有出现了生产者组和消费者组,如下图:
image

2.3 Broker 集群模式

随着生产者和消费者的不断扩大,原本单一的Broker数据处理的能力始终是有限的(无论是被写入、存储或者被消费),所以这个时候就需要对Broker进行scale out,来分担单机的压力。我们称之为 Broker 集群模式。在 微服务系列MySQL系列Redis系列 中,我们已经了解过很多Cluster模式的案例。
image
这边需要注意,每个Broker 可以包含1个 Broker Master 和 至少 1个Broker Slave ,所以它是主从结构,通过 Data Sync、Async 来进行数据同步。 Producer 只能将消息发送到 Broker Master,但是 Consumer 同时和Broker Master和 Broker Slave 建立长连接,既可以从 Master 订阅消息,也可以从 Slave 订阅消息。

2.4 使用 NameServer 来进行路由管理

我们既然使用了Broker Cluster模式,那么就会有多个Broker实例。这时候就有新的问题了,producer生产的消息需要发送到哪个Broker中,comsumer又要去哪个Broker里面去取数据,都需要梳理清楚,不然就很混乱。RocketMQ摒弃了业界常用的zookeeper作为注册中心(比如Kafka),而是使用自研的 NameServer 来管理 具有映射关系的路由信息。由它来告诉producer,某个 Topic 的消息可以发给哪些队列,同时告诉consumer可以从哪些队列里面获取你需要的消息。NameServer 也可以有很多个,组成 NameServer 集群。
总得来说,NameServer是一个功能完整的命名服务组件,提供轻量级的服务发现及完整路由信息记录能力,主要包含两个功能:

上述的流程图比较清晰的描述如下运转流程:

3 总结

架构与思维公众号 架构与思维·公众号:撰稿者为bat、字节的几位高阶研发/架构。不做广告、不卖课、不要打赏,只分享优质技术 ★ 加公众号获取学习资料和面试集锦 码字不易,欢迎关注,欢迎转载 作者:翁智华 出处:https://www.cnblogs.com/wzh2010/ 本文采用「CC BY 4.0」知识共享协议进行许可,转载请注明作者及出处。   转 https://www.cnblogs.com/wzh2010/p/16556570.html

标签:架构,队列,Broker,Topic,MQ,消息,NameServer,RocketMQ
来源: https://www.cnblogs.com/wl-blog/p/16626278.html