Kafka、RabbitMQ以及RocketMQ调研
起初当我们准备引入消息队列的时候,一共发现业界内使用很多的有四种MQ,分别是ActiveMQ、Kafka、RabbitMQ、RocketMQ。由于ActiveMQ目前并不是很活跃了,就直接没去深入对比了,前几年这个MQ用的还是比较多的,我在2015年之前在金融机构的项目基本都是基于ActiveMQ来做的。所以,我们今天就对Kafka、RabbitMQ、RocketMQ这三种MQ来做个选型对比
Kafka的优缺点
我们先来看看大家特别熟悉的Kafka中间件。
优点:
- 首先,Kafka的最大优势就在于它的高吞吐量,在普通机器4CPU8G的配置下,一台机器可以抗住十几万的QPS,这一点还是相当优越的。
- 其次,Kafka的性能同样很高,发送消息过去基本都是毫秒级别的。
- Kafka支持集群部署,如果部分机器宕机不可用,则不影响Kafka的正常使用。
缺点:
- Kafka有可能会造成数据丢失,因为它在收到消息的时候,并不是直接写到物理磁盘的,而是先写入到磁盘缓冲区里面的。
- Kafka功能比较的单一 主要的就是支持收发消息,高级功能基本没有,就会造成适用场景受限。
业界里一般将kafka用来处理用户的行为日志的采集的传输,用在大数据团队较多,我们公司同样也引入了它,就只是用来收发消息这种的场景,如用户行为日志等。因为,可以接受数据的丢失,而且要求吞吐量要极高。
RabbitMQ的优缺点
其实在RabbitMQ开始被广大程序员接受的时候,就有很多公司开始将自己ActiveMQ中间件切换到RabbitMQ中去了,直到现在被使用的频率还是很高的。
优点:
- RabbitMQ能保证数据不丢失
- 能保证高可用,部分机器宕机了还可以继续使用。
- 支持很多高级功能,如消息重试、死信队列等
缺点:
- 首先是RabbitMQ吞吐量比较低,大概在每秒几万的样子,这样像对于大型电商促销秒杀就不能胜任。
- 集群线性扩展比较麻烦。
- 开发语言是erlang,懂得人不是很多,无法对其改造。
RocketMQ的优缺点:
RocketMQ是阿里巴巴开源的消息中间件,各方面也表现的比较优越,几乎同时解决了Kafka和RabbitMQ它们两个的缺点。
优点:
- 吞吐量很高,大概普通机器有十万QPS往上。
- 保证高可用,高性能。
- 保证数据绝对不丢失
- 支持大规模集群部署,线性扩展方便
- 支持各种高级的功能,如延迟消息、消息回朔等
- java语言开发,满足了国内绝大部分公司技术栈
缺点:
目前我觉得唯一的缺点就是文档没有前面两种文档详细,写的稍微简单了点。
该怎么对比选择呢
通过上面的调研结果来看,其实大家应该就能很容易的选出自己的消息队列中间件。同时我这里也给点自己的建议:
- 如果我们业务只是收发消息这种单一类型的需求,而且可以允许小部分数据丢失的可能性,但是又要求极高的吞吐量和高性能的话,就直接选Kafka就行了,就好比我们公司想要收集和传输用户行为日志以及其他相关日志的处理,就选用的Kafka中间件。
- 如果自己所处公司业务比较平稳,未来几年内不会出现飞速发展,而且没有什么改源码的特殊需求的话,在面对选择MQ的时候就可以选用RabbitMQ。毕竟如今这样的中小公司也就是这么干的。
- 如果自己所处公司发展迅猛,一年经常搞一些特别大的促销秒杀活动,公司技术栈主要是Java语言的话,就直接一步到位选择RocketMQ,这样会省很多事情。