消息队列技术选型:Kafka、RocketMQ、Redis、RabbitMQ 应该怎么选?

Posted by 陈树义 on 2019-01-07

要做技术选型,那么必须对现今的各个消息中间件有个深入的理解才能做技术选型。否则别人问你,你为什么要用这个消息中间件,你说不出个所以然来,怎么做架构师呢?

介绍

截止到目前为止,现在业界流行的消息队列中间件有:Redis、ActiveMQ、RabbitMQ、RocketMQ、Kafka。下面我们将逐个对他们进行分析介绍。

Redis

在我们印象中,Redis 是一个 key-value 缓存中间件,而不是一个消息队列中间件。但 Redis 本身支持 MQ 功能,所以完全可以当做一个轻量级的队列服务来使用。

从网络查阅资料,对比 RabbitMQ 和 Redis 的入队和出队操作,各执行 100 万次,每 10 万次记录一次执行时间。测试数据分为 128Bytes、512Bytes、1K 和 10K 四个不同大小的数据。

实验表明:入队时,当数据比较小时 Redis 的性能要高于 RabbitMQ,而如果数据大小超过了 10K,Redis 则慢的无法忍受。出队时,无论数据大小,Redis 都表现出非常好的性能,而 RabbitMQ 的出队性能则远低于 Redis。

但在实际应用中,大家在考虑消息中间件的时候一般都不考虑 Redis。我想有两个原因,一方面是数据大小超过 10K 速度很慢,另一个问题是 Redis 给人的印象就是做缓存的。基于上面这两点原因,Redis 更适合用来做很小规模、业务简单的消息队列场景。 如果业务复杂、业务规模大,一般情况下 Redis 就会被排除。

ActiveMQ

ActiveMQ 是 Apache 下的一个子项目。 类似于 ZeroMQ,它能够以代理人和点对点的技术实现队列。同时类似于 RabbitMQ,它少量代码就可以高效地实现高级应用场景。

RabbitMQ

RabbitMQ 是使用 Erlang 编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正因如此,它非常重量级,更适合于企业级的开发。同时实现了 Broker 构架,这意味着消息在发送给客户端时先在中心队列排队。对路由,负载均衡或者数据持久化都有很好的支持。

Kafka

Kafka 是 Apache 下的一个子项目,是一个高性能跨语言分布式发布 / 订阅消息队列系统。它具有以下特性:

  • 快速持久化,可以在 O(1) 的系统开销下进行消息持久化。
  • 高吞吐,在一台普通的服务器上既可以达到 10W/s 的吞吐速率。
  • 完全的分布式系统,Broker、Producer、Consumer 都原生自动支持分布式,自动实现负载均衡。
  • 支持 Hadoop 数据并行加载,对于像 Hadoop 的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。

RocketMQ

RocketMQ 是阿里巴巴开源的一个项目,目前已经纳入 Apache 基金会。其是在 Kafka 的基础上发展起来的,起因是随着阿里巴巴业务的发展,他们发现 Kafka 对于具体业务场景的支持不完善,所以才有了 RocketMQ 的诞生。

与 Kafka 比起来,RocketMQ 很多方面都极其相似。唯一的不同是 RocketMQ 对于业务特性的支持更完善,所以更适用于业务场景。

下面的表格从各个方面对比了上面的几个消息队列:

image.png

从上面的表格我们可以看出几个简单的结论:

  • 无论是在单机吞吐量还是可用性方面,ActiveMQ和RabbitMQ都差不多,而RocketMQ和Kafka差不多。
  • 在功能特性方面,ActiveMQ、RabbitMQ、RocketMQ功能比较完善。Kafka功能性较弱。

归纳

基于以上的几点几轮,我们可以把消息队列归结为以下几类:

Redis

对于 Redis 来说,缓存才是主业,队列功能只是一个附加功能。所以更加适合于业务简单、规模小的业务场景。

RabbitMQ、ActiveMQ

根据上面的对比,我们可以知道 RabbitMQ 和 ActiveMQ 的优点是功能丰富,缺点是单机性能和可用性稍弱。

对于中小型公司来说,它们的需求是:研发成本低、快速上手,不需要太高的性能。可以看到 RabbitMQ 和 ActiveMQ 就是为中小型公司量身定做的。

而在 RabbitMQ 和 ActiveMQ 这两个消息中间件中,RabbitMQ 的更新频率和社区更加活跃一些,所以可以优先选择 RabbitMQ 作为中间件。

RocketMQ、Kafka

对于 RocketMQ 和 Kafka 来说,虽然他们的单机吞吐量高、可用性也很高。但这意味着他们的技术也更加复杂,对于研发人员的要求也越高。

而对于大型互联网公司,其对于吞吐量和可用性的要求更高,并且有许多定制化的需求。所以大型互联网公司更加适合用 RocketMQ 和 Kafka。

而对于 RocketMQ 和 Kafka 这两者来说,它们的对比也很明显。RocketMQ 牺牲了一些性能,换来业务特性的支持。而 Kafka 则支持极致的吞吐量。所以在业务场景下使用 RocketMQ,而非业务场景则使用 Kafka。

总结

框架特点业务场景
Redis功能简单简单的业务场景、规模小
RabbitMQ、ActiveMQ功能丰富、吞吐量和可用性适中稍微复杂的业务场景、规模适中(中小公司)
RocketMQ功能丰富、定制化强、吞吐量和可用性高复杂的业务场景、规模大(大型公司的业务场景)
Kafka吞吐量、可用性超高规模超大的非业务场景(大型公司的非业务场景)

参考资料