RabbitMQ/RocketMQ/Kafka 单机架构的对比
RabbitMQ
1.在RabbitMQ中,生产者通过与Broker连接并且建立信道(Channel),将消息发送至交换器(Exchange)。然后根据Exchange 的类型,将消息路由到指定队列。
2.消费者通过与Broker连接并且建立信道(Channel),消费队列消息。
3.关键字
channel: 信道,一个连接内的逻辑区分。
routeKey: 路由key 与 bindKey 相对应
Exchange: 可以视为一个名称与队列绑定的列表
Queue: 队列
4.在RabbitMQ中,一个队列就包含了所有的消息。
RocketMQ
1.在RocketMQ中,创建Topic是需要指定名称和队列的数量(默认4个队列)。当生成者发布消息到broker时,客户端会根据指定策略,将消息发送的指定队列。Broker收到消息之后,会将消息写入commitLog & consumeQueue,并根据刷盘策略落地。
2.消费者会根据指定策略,被分配的不同的队列中进行消费(一个队列只能被同一个消费组中的一个消费者消费),并在消费完成后提交消费位移。
3.这里关键字是
Topic:主题
Queue:队列
消费位移
4.在RocketMQ中,所有队列的并集就是消息总和。
Kafka
1.在Kafka中,创建Topic是需要指定名称和分区的数量。当生成者发布消息到broker时,客户端会根据指定策略,将消息发送的指定分区。Broker收到消息之后,会将消息写入.log & .index & .timeIndex ,并根据刷盘策略落地。
2.消费者会根据指定策略,被分配的不同的分区中进行消费(一个分区只能被同一个消费组中的一个消费者消费),并在消费完成后提交消费位移。
3.这里关键字是
Topic:主题
Partition:分区
消费位移
4.在Kafka中,所有分区的并集就是消息总和。
总结
1.RabbitMQ 、RocketMQ 和 Kafka 在存储消息的模式存在区别。RabbitMQ是典型的内存式堆积(不是绝对的,当内存不足时,会出现换页现象),而 RocketMQ 与 Kafka 是磁盘式堆积。一般情况下磁盘的空间都远大于内存,所有相对而言,RocketMQ 和 Kafka 的消息堆积能力更强。
2.概念的区分。
RabbitMQ: Exchange、Queue
RocketMQ: Topic、MessageQueue
Kafka: Topic、Partition
3.数据集合
RabbitMQ 每个队列拥有全部数据
RocketMQ 队列的并集为全部数据
Kafka 分区的并集为全部数据
4.日志存储的区别
RabbitMQ 消息存储在内存
RocketMQ 消息存储在一个日志文件,相应队列只存储对应的消息偏移量
Kafka 消息分布存储在不同的分区,每个分区包含日志文件,偏移量文件及时间偏移量文件。
参考
1.狸猫技术窝 RocketMQ系列
2.《深入理解Kafka:核心设计与实践原理》
3.《RabbitMQ实战》