共计 6973 个字符,预计需要花费 18 分钟才能阅读完成。
Apache RocketMQ 是阿里开源的一款高性能、高吞吐量的分布式消息中间件。
整体架构
路由元信息
topicQueueTable:topic 消息队列路由信息。 brokerAddrTable:broker 基础信息。包含 broker name,所属集群名称,主 broker 地址等。 clusterAddrTable:broker 集群信息,存储集群中所有 broker 的名称。 brokerLiveTable:broker 状态信息。 filterServerTable:broker 上的 filterServer 列表。filterServer 用于消息过滤。
路由注册 RocketMQ 路由注册是通过 broker 与 Namesrv 的心跳功能实现的。broker 启动时向集群中所有 Namesrv 发送心跳包,之后每隔 30 秒向集群中所有 Namesrv 发送心跳包。心跳包中包含:broker 集群信息、broker 信息、topic 配置信息、broker 关联的 FilterServer 列表等。如果 brokerA 为 Master。并且 brokerA 上的 topic1 的配置信息发生变化或初次注册,Namesrv 会根据报文创建或更新 Topic 路由元数据,填充 topicQueueTable。 路由删除 Namesrv 收到 brokerA 的心跳包会更新 brokerLiveTable 中的 brokerA 对应的 BrokerLiveInfo 中的 lastUpdateTimestamp。Namesrv 每隔 10 秒扫描 brokerLiveTable 一次。如果 brokerA 对应的 BrokerLiveInfo 中 lastUpdateTimestamp 距当前时间超过 120 秒,Namesrv 认为 brokerA 失效,会将 brokerA 的路由信息移除并关闭与 broker 的 socket 连接。更新:topicQueueInfo、brokerAddrTable、brokerLiveTable、filterServerTable 等。 路由发现 RocketMQ 路由发现是非实时的。当 Topic 路由信息发生变化是,Namesrv 不会主动推送给客户端(Producer、Consumer)。而是由客户端定时到 Namesrv 拉去最新的路由信息并缓存(包含 Topic 路由信息)。
与 kafka 对比
kafka 由 zookeeper 集群提供命名服务(Naming Service)。
Kafka 通过 ZooKeeper 管理集群配置、选举 Leader 以及在 consumer g
Broker
与 kafka 对比:
kafka 和 RocketMQ 的 broker 都可以容纳多个一个或多个分区数据(kafka 分区:partition;RocketMQ 分区:queue)。
kafka 基于 partition(分区)做备份 / 高可用(partition follower)。
RocketMQ 增加了 broker group 的概念,基于 broker(可能包含多个分区)。
Producer、Consumer 都只需要和集群中一个 Namesrv 建立长连接。Broker 需要向集群中所有的 Namesrv 发送心跳包。
其实很好理解:
Namesrv 集群提供高可用的命名服务。
Producer、Consumer 只需要从其中一台定期同步路由信息。
如果 Broker 只随机调一台发送心跳包。那么不同的 Namesrv 保存的路由信息会出现
消费者类型:
拉取式消费(Pull Consumer)Consumer 消费的一种类型,应用通常主动调用 Consumer 的拉消息方法从 Broker 服务器拉消息、主动权由应用控制。一旦获取了批量消息,应用就会启动消费过程。Pull 方式里,取消息的过程需要用户自己写(包括提交 offset 等操作)。 推动式消费(Push Consumer)Consumer 消费的一种类型,该模式下 Broker 收到数据后会主动推送给消费端,该消费模式一般实时性较高。Push Consumer 原理上也是采取 pull 模式。实际上就是长轮询的 pull 模式。
一些概念
主题(Topic)表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是 RocketMQ 进行消息订阅的基本单位。每个 topic 可分为若干个分区(queue)。 生产者组(Producer Group)同一类 Producer 的集合,这类 Producer 发送同一类消息且发送逻辑一致。如果发送的是事务消息且原始生产者在发送之后崩溃,则 Broker 服务器会联系同一生产者组的其他生产者实例以提交或回溯消费。 消费者组(Consumer Group)同一类 Consumer 的集合,这类 Consumer 通常消费同一类消息且消费逻辑一致。消费者组使得在消息消费方面,实现负载均衡和容错的目标变得非常容易。要注意的是,消费者组的消费者实例必须订阅完全相同的 Topic。RocketMQ 支持两种消息模式:集群消费(Clustering)和广播消费(Broadcasting)。 普通顺序消息(Normal Ordered Message)普通顺序消费模式下,消费者通过同一个消费队列收到的消息是有顺序的,不同消息队列收到的消息则可能是无顺序的。 严格顺序消息(Strictly Ordered Message)严格顺序消息模式下,消费者收到的所有消息均是有顺序的。 消息(Message)消息系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题。RocketMQ 中每个消息拥有唯一的 Message ID,且可以携带具有业务标识的 Key。系统提供了通过 Message ID 和 Key 查询消息的功能。 标签(Tag)为消息设置的标志,用于同一主题下区分不同类型的消息。来自同一业务单元的消息,可以根据不同业务目的在同一主题下设置不同标签。标签能够有效地保持代码的清晰度和连贯性,并优化 RocketMQ 提供的查询系统。消费者可以根据 Tag 实现对不同子主题的不同消费逻辑,实现更好的扩展性。
关于消息中间件
1. 消息优先级(Message Priority;RocketMQ 不支持)
2. 顺序消息(Message Order)
投递消息的顺序性:投递消息的顺序性可通过将一组消息投递到同一分区实现。例如:借助 MessageQueueSelector 将对相同订单的操作消息投放到同一分区。 消费消息的顺序性:RoctetMQ 特性保障:特定分区(queue)中的消息不能同时被同一个消费者组中的多个 Consumer 消费,以避免重复消费。通过自定义或使用预置的 AllocateQueueStrategy 可设定分区的分配策略(哪些分区分配给哪个消费者消费)。
3. 高可用、消息可靠性
3.1 消息持久化
3.2 broker master/salve
4. 高并发、可扩展 ==> 分布式
4.1 生产并行度
4.2 消费并行度
4.3 消息队列分配策略
MessageQueueSelector
AllocateMessageQueueStrategy
AllocateMessageQueueAveragely:平均分配算法 AllocateMessageQueueAveragelyByCircle:基于环形平均分配算法 AllocateMachineRoomNearby:基于机房临近原则算法 AllocateMessageQueueByMachineRoom:基于机房分配算法 AllocateMessageQueueConsistentHash:基于一致性 hash 算法 AllocateMessageQueueByConfig:基于配置分配算法
参考:
作者:RyanLee86799 来源:https://juejin.im/post/6844904130822029320 文章转载:JAVA 高级架构
(版权归原作者所有,侵删)
正文完
星哥玩云-微信公众号