1

Apache RocketMQ™是一个开源的分布式消息和流数据平台。

1、既然是消息系统,最核心的功能就是要提供消息的发布与订阅功能,最简单的概念模型如下:

image

但是rocketmq提供的能力会比这个复杂的多,如一个生产方发布消息,需要多个消费方订阅,也会存在多个生产方生产消息,一个消费方消费消息,出现一对多,多对一的情况。

image

上图就是扩展了producer、consumer和Topic的概念模型,rocketmq最核心的概念就是Tpoic,producer和consumer都是围绕Topic展开,每个broker下可以有多个topic,topic下又可以有很对队列messageQueue,相同的topic又可以分布在不同broker节点下,producer发送消息会轮训的发送到topic的队列下;相同consumer分组是负载均衡订阅消息,不同的consumer分组之间互不干扰,即使广播订阅消息;同一Topic下的每个队列只能被相同分组下的一个consumer订阅消费,但一个consumer可以消费多个队列。

2、整体部署架构图

image

  • nameserver是几乎没有状态的节点,可以集群部署,节点之间也没有任何数据同步。
  • broker的部署相对复杂,是一个数据分散集群,分master和slave,每个master存储一部分数据,为了数据的高可用,每个master节点可以有多个slave节点,master之间无数据同步,master与slave之间有数据同步。master和slave之间的关系通过brokerName来绑定,brokerId来定义,即相同的brokerName,brokerId等于0表示master节点,非0表示slave节点。所有的broker节点与nameserver集群的所有节点保持长连接,定时注册Topic信息到所有的nameserver。
  • producer与nameserver集群中的一台(随机)保持长连接,定时获取Topic路由信息,并且与提供Topic服务的broker的master节点保持长连接,并定时发送心跳,producer集群也是无状态的,可以集群部署。
  • consumer与nameserver集群中的一台(随机)保持长连接,定时获取Topic路由信息,并且向提供Topic的broker的master和slave节点都保持长连接,并定时发送心跳,Consumer既可以从 Master 订阅消息,也可以从 Slave 订阅消息,订阅规则由 Broker 配置决定,consumer也是集群的部署的,负载均衡的消费Topic的消息。

3、消息的存储模型

image

rocketmq的消息存储与消费队列是分开的,消息被存储在commitLog下,然后再异步构建消费队列messageQueue,消费队列并不存储真正的消息内容,只是存储消息在commitLog下的偏移量、消息的长度和消息的tag的hashcode。如图所示:

  • 所有数据单独存储到一个 Commit Log,完全顺序写,随机读。
  • 对最终用户展现的队列实际只存储消息在 Commit Log 的位置信息,并且串行方式刷盘。

这样设计有以下优势:

  • 队列轻量化,单个队列数据量非常少。
  • 对磁盘的访问串行化,避免磁盘竟争,不会因为队列增加导致 IOWAIT 增高。

但也存在以下缺点:

  • 写虽然完全是顺序写,但是读却变成了完全的随机读。
  • 读一条消息,会先读 Consume Queue,再读 Commit Log,增加了开销。
  • 要保证 Commit Log 与 Consume Queue 完全的一致,增加了编程的复杂度。

4、rocketmq具有以下特点

  • 能够保证严格的消息顺序
  • 提供丰富的消息拉取模式
  • 高效的订阅者水平扩展能力
  • 实时的消息订阅机制
  • 亿级消息堆积能力

与其他消息队列系统的一个对比如下:

消息产品支持客户端协议和规范顺序消息定时消息批量消息广播消息消息过滤消息回溯消息优先级高可用和故障切换消息追踪配置管理和操作工具Server Triggered Redelivery消息存储
ActiveMQjava,c++,php,net推模型,支持 OpenWire, STOMP, AMQP, MQTT, JMS独占消费和消息分组支持顺序支持不支持支持支持支持支持支持,leveldb+zookeeper不支持默认配置是低级别的,用户需要优化配置参数支持不支持支持JDBC,leveldb,kahadb
Kafkajava,scala拉模型, 支持TCP分区内消息有顺序不支持支持异步生产者不支持支持支持不支持支持,依赖zookeeper不支持Kafka使用键值对格式进行配置。这些值可以通过文件提供,也可以通过编程方式提供支持,使用命令行不支持高性能文件存储
RocketMQjava,c++,go拉模型, 支持TCP, JMS, OpenMessaging确保消息的严格顺序,并可以优雅地扩展支持支持同步模式,以避免消息丢失支持支持支持按时间和偏移量不支持支持主从模式支持开箱即用,用户只需注意一些配置支持,命令行和web客户端支持高性能和低延迟的文件存储

杨辉
92 声望18 粉丝

程序猿