rocketMq是由阿里开源的,后面交由Apache维护,先看下rocketMq的物理架构。
rmq-basic-arc.png
rocketMq参照了kafka的设计,所以架构上和kafka还是挺相似。但是既然重新开发了rocketMq,一定有其不同和优势。
rocketMq由producer、broker、name server、consumer构成。
- producer生产者,从name server获取broker地址、topic信息,将数据发送到broker。
- broker,由producerGroup标识一个集群,接收并存储消息,根据id分为master、slave节点,master节点可读可写,slave可配置读。
- name server,维护broker节点信息,生产者、消费者都从name server获取topic的路由信息。
-consumer,消费者从name server获取路由信息,连接到broker消费数据。也有consumer group分组,默认和kafka一样均分消息消费,也可以每个消费者全量消费。 - Message,不同于kafka,一个topic下划分为不同队列,并且topic的消息统一混合存储在一个文件,在该文件基础上构建索引。
对比:
- 相比于kafka集群元数据保存在zookeeper,由zk来维护数据的一致性,当然broker controller 也担负了重要职责;rocketMq则是将元数据保存在name server,并且由各broker节点负责更新。
- kafka在leader挂掉后,可以从flower中选举;rocketMq中broker身份则是固定,master挂掉后,数据会推送给其他master。
- kafka各个partition单独存储,并发写入更快,但partition过多时,访问磁盘需要寻道,使得io速度降低。
- kafka按照partition分开存储消息,消息在单个partition内部顺序存储;rocketMq将topic所有队列消息混合存储在单个文件,在该文件基础上构建索引,所以查询时要多一个步骤。
- rocketMq支持单个消息查询,可根据id,也可根据消息内容查询。
- rocketMq的消息顺序性和kafka几乎一致,是建立在单队列的基础上的,对应kafka的单分区消息顺序性。
RocketMq主要优点:
- 消息支持事务,包括多系统(两个以上)之间的事务性。
- 消息支持tag级别的过滤,减少不必要的数量流。
参考:
http://rocketmq.apache.org/docs/motivation/
//www.greatytc.com/p/c474ca9f9430
https://blog.csdn.net/damacheng/article/details/42846549