前言
不论Kafka还是RabbitMQ和RocketMQ,作为消息中间件,其作用为应用解耦、异步通讯、流量削峰填谷等。
拿我之前参加的一个电商项目来说,订单消息通过MQ从订单系统到支付系统、库存系统等,当订单信息写入MQ后就不再关心后续操作,既达到了应用解耦又达到异步通信。因为订单的并发量较大,为了避免数据库承受不住,在订单信息持久化时通过MQ+定时任务将订单信息均匀的持久到数据库中,达到削峰填谷作用。
那为什么有这么多的MQ?这些MQ又有什么区别?本文基于RabbitMQ、Kafka、RocketMQ,从侧重点、架构模型、消息通讯以及其他方面对比说明。
侧重点
每个MQ的侧重点不一样。
- RabbitMQ
RabbitMQ由以高性能、健壮以及可伸缩性出名的Erlang语言编写,在扩展或删除Rabbit服务节点时只需要同步erlang信息即可。另外rabbitmq在数据可靠性的问题上做了很大的努力,它保证在这里数据是非常可靠的。
- Kafka
Kafka由Scala和Java编写,与RabbitMQ不同,Kafka是一种高吞吐量的分布式消息中间件,其通过零拷贝、pagecahe技术以及分区的设计实现高吞吐,同时分区的设计也避免了消息存储瓶颈问题。
- RocketMQ
RocketMQ是阿里出品的,参考Kafka架构使用Java语言重新编写的一个消息中间件,弥补了Kafka的扩展性,在Kafka基础上扩展了多种消息模式,比如延迟消息、事务消息。
架构模型
- RabbitMQ
RabbitMQ基于AMQP协议实现,其模型如下:
Kafka与RocketMQ架构类似,RocketMQ使用NameServer代替了Zookeeper,这一点我觉得对开发人员是比较友好的,少了一个组件。
- Kafka
- RocketMQ
消息通讯
- RabbitMQ
RabbitMQ支持发布订阅、Topic及RPC多种通讯方式,满足大部分消息通讯,并支持死信队列。另外,RabbitMQ的插件社区支持丰富的插件,可通过安装插件添加额外的功能。例如,延迟队列、优先队列、管理控制台等插件。
- Kafka
相比RabbitMQ,Kafka只有单一的Topic通讯方式,消息在消费后依然不支持死信队列、延迟队列等。
- RocketMQ
RocketMQ也是基于Topic进行通讯,毕竟架构模型相似,不过RocketMQ本身支持延迟消息、事务消息等,功能比较丰富。
其他对比
RabbitMQ | Kafka | RocketMQ | |
---|---|---|---|
社区活跃度 | 高 | 较高 | 一版 |
持久化 | 支持 | 支持 | 支持 |
并发吞吐 | 高 | 极高 | 极高 |
时效性 | us级 | ms级 | ms级 |
数据可靠 | 极高 | 高 | 高 |
应用场景 | 高可靠交易系统 | 日志系统、大数据应用 | 互联网高并发、高可用应用 |
总结
每个MQ的功能及作用大差不差,都有自己的优势以及不足,选择适合业务的MQ就可以。
参考文档
Kafka、RabbitMQ、RocketMQ详细了解参考[消息中间件专栏]