要做技术选型,那么必须对现今的各个消息中间件有个深入的理解才能做技术选型。否则别人问你,你为什么要用这个消息中间件,你说不出个所以然来,怎么做架构师呢?
截止到目前为止,现在业界流行的消息队列中间件有:Redis、ActiveMQ、RabbitMQ、RocketMQ、Kafka。下面我们将逐个对他们进行分析介绍。
Redis
在我们印象中,Redis 是一个 key-value 缓存中间件,而不是一个消息队列中间件。但事实上它本身支持 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 对于业务特性的支持更完善,所以更适用于业务场景。
下面的表格从各个方面对比了上面的几个消息队列:
从上面的表格我们可以看出几个简单的结论:
- 无论是在单机吞吐量还是可用性方面,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 | 吞吐量、可用性超高 | 规模超大的非业务场景(大型公司的非业务场景) |
总结
本文讲了下面几个要点:
- 业界流行框架的介绍
- 各大消息中间件的对比
看完之后,你应该能解答下面几个问题:
- 我的系统要使用哪个消息队列中间件?
下篇,我们聊聊使用消息队列需要考虑的几个问题。