虽然在以往的项目开发过程中已经使用过RabbitMQ与Kafka,但还是不能准确并全面的总结出它们俩之间的差异。
在这之前很长一段时间一直都是把这两种技术当做等价的来看待,突然想到如果是我在某种特定业务下来做选型的话,我要怎么选呢?万一选错了,对于软件开发和后期的维护都会造成严重的影响。
所谓学而时习之,不亦说乎。温故而知新,可以为师矣。所以通过官网和参考了一些博客,做了以下整理:
宏观的差异,RabbitMQ与Kafka只是功能类似,并不是同类
RabbitMQ是消息中间件,Kafka是分布式流式系统。
RabbitMQ
被概括为“开源分布式消息代理”,用Erlang编写,有助于在复杂的路由方案中有效地传递消息,可以通过服务器上启用的插件进行扩展,高可用(队列可以在集群中的机器上进行镜像)
有队列
RabbitMQ的发布/订阅模式
Apache Kafka
被描述为“分布式事件流平台”,用Scala和Java编写,促进了原始吞吐量,基于“分布式仅追加日志”的思想,该消息将消息写入持久化到磁盘的日志末尾,客户端可以选择从该日志开始读取的位置,高可用(Kafka群集可以在多个服务器之间分布和群集)
无队列,按主题存储
Kafka的发布/订阅模式
微观差异,类似功能的不同特点
Kafka支持消息有序性,RabbitMQ不保证消息的顺序
RabbitMQ
Kafka
在消息路由和过滤方面,RabbitMQ提供了更好的支持
RabbitMQ
Kafka
消息时序
RabbitMQ
Kafka
Kafka支持消息留存,RabbitMQ不支持
RabbitMQ
Kafka
RabbitMQ的容错处理优于Kafka
RabbitMQ
Kafka
如果消费者阻塞在重试一个消息上,那么底部分区的消息就不会被处理
Kafka在伸缩方面更优并且能够获得比RabbitMQ更高的吞吐量
RabbitMQ
Kafka
RabbitMQ的消费者复杂度低于Kafka
RabbitMQ
Kafka
结论
首先是在不考虑一些非功能性限制(如运营成本,开发人员对两个平台的了解等)的情况下:
优先选择RabbitMQ的条件
- 高级灵活的路由规则。
- 消息时序控制(控制消息过期或者消息延迟)。
- 高级的容错处理能力,在消费者更有可能处理消息不成功的情景中(瞬时或者持久)。
- 更简单的消费者实现。
优先选择Kafka的条件
- 严格的消息顺序。
- 延长消息留存时间,包括过去消息重放的可能。
- 传统解决方案无法满足的高伸缩能力。