消息中间件对比
本文以RabbitMQ和Kafka为主,对消息中间件的不同方面进行对比,整理了消息中间件在设计和实现方面的差别,在实际使用中可作参考、借鉴。
主要参考资料:
RabbitMQ、Kafka、RocketMQ官方文档;
分布式消息中间件时间(倪炜 著);
深入理解Kafka:核心设计与实践原理;
RabbitMQ实战指南(朱忠华 著);
支持的协议
Kafka 基于TCP,自己定义的协议
RabbitMQ AMQP
RocketMQ 自己定义的协议
开发语言
Kafka Scala
RabbitMQ Erlang
RocketMQ Java
架构
Kafka架构:
RabbitMQ架构:
消息存储
对比1:
Kafka中消息可存储于内存、磁盘、数据库。支持大量堆积。
RabbitMQ中消息存储与内存和磁盘。不支持大量堆积。(除了带有持久存储标签的消息,在内存够用的情况下一般不往磁盘中放,因此限制了消息的可堆积量)
对比2:
Kafka中的消息队列是以文件为存储形式,可以记录一个个偏移量offset,为很多机制的实现提供了诸多便利。
RabbitMQ中的消息队列是队列的形式,在很多方便没有kafka方便,这也是rabbitMQ不支持消息大量堆积的一个原因。
安全性保障(单节点故障应对)
Kafka:多副本机制
Kafka为分区引入了多副本的机制(Replica),通过增加副本数量可以提高容灾能力。同一分区的不同副本中保存的是相同的消息(在同一时刻,副本之间并非完全一样),副本之间是“一主