RocketMQ、Kafka、RabbitMQ不完全对比
产品组件(组成)
产品 | 组件 | 组件 | 组件 | 组件 | 组件 | 组件 | 组件 |
---|---|---|---|---|---|---|---|
Rocket MQ | p(producer) | c(consumer) | brocker(支持pull和push,支持顺序行消费) | NameServer(服务发现和服务路由,记录路由信息) | CommitLog(消息持久化存储) | Consumer Queue(存储的是在CommitLog中的偏移量延迟队列) | |
Kafak | p(producer) | c(consumer) | brocker(存储message) | zk(管理p/c/broker的注册) | topic(逻辑概念) | ||
Rabbit MQ | p(producer) | c(consumer) | exchanger(P与ex直连,通过p的ROUTING_KEY进行消息路由,将消息发送给queue,可以持久化) | Queue(与消费者直连,可持久化) | Binding(exchange与queue的绑定规则) | Routing Key(exchange据此路由消息) | vhost |
产品特性
产品 | 队列优先级 | 队列重试 | 消费方式 | 广播模式 | 持久化 | 跨语言 | 顺序 | 事务 | 性能 | 定时 |
---|---|---|---|---|---|---|---|---|---|---|
Rocket MQ | 支持 | 支持 | pull+push | 支持 | 支持 | Java, C++, Go,对java最友好 | 支持 | 支持 | 搞 | 支持 |
Kafka | 不支持 | 不支持 | pull | 支持 | 支持 | java编写,支持多语言 | 单个分区消息有序 | 支持 | 最高 | 不支持 |
Rabbit MQ | 支持 | 支持 | pull+push | 支持 | 支持 | Erlang编写,支持多语言 | 可以认为不支持 | 支持 | 高 | 支持 |
关于性能
咨询了下朋友kafaka性能搞的原因主要是Kafka的在producer端将多个小消息合并,发送到broker中,还有个重要的原因是做到零拷贝,无需CPU拷贝。还有一些其他原因如kafaka利用partition实现并行处理,最大并发度等于partition的数量。
RocketMQ没有做消息合并主要考虑到java gc的问题,还有就是消息合并发送万一出现down机,丢失消息也比不合并出现的问题大。