【消息队列】消息队列选型问题
上一篇我们探讨了为什么使用消息队列,以及消息队列的缺点。今天我们来探讨一下我们到底该使用哪一种消息队列。没有最好的技术只有最合适的技术,不要为了追求最好的性能而忽略了可用性,时刻记住“过早优化是原罪”
先说结论:
中小型公司,技术实力较为一般,技术挑战不是特别高,用RabbitMQ是不错的选择;大型公司,基础架构研发实力较强,用RocketMQ是很好的选择
如果是大数据领域的实时计算、日志采集等场景,用Kafka是业内标准
截止到目前为止,现在业界流行的消息队列中间件有:
-
Redis
-
ActiveMQ
-
RabbitMQ
-
RocketMQ
-
Kafka
(1)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 就会被排除。
(2)ActiveMQ
ActiveMQ 是 Apache 下的一个子项目。 类似于 ZeroMQ,它能够以代理人和点对点的技术实现队列。同时类似于 RabbitMQ,它少量代码就可以高效地实现高级应用场景。
(3)RabbitMQ
RabbitMQ 是使用 Erlang 编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正因如此,它非常重量级,更适合于企业级的开发。同时实现了 Broker 构架,这意味着消息在发送给客户端时先在中心队列排队。对路由,负载均衡或者数据持久化都有很好的支持。
(4)Kafka
Kafka 是 Apache 下的一个子项目,是一个高性能跨语言分布式发布 / 订阅消息队列系统。它具有以下特性:快速持久化,可以在 O(1) 的系统开销下进行消息持久化;高吞吐,在一台普通的服务器上既可以达到 10W/s 的吞吐速率;完全的分布式系统,Broker、Producer、Consumer 都原生自动支持分布式,自动实现负载均衡;支持 Hadoop 数据并行加载,对于像 Hadoop 的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。
(5)RocketMQ
RocketMQ 是阿里巴巴开源的一个项目,目前已经纳入 Apache 基金会。其是在 Kafka 的基础上发展起来的,起因是随着阿里巴巴业务的发展,他们发现 Kafka 对于具体业务场景的支持不完善,所以才有了 RocketMQ 的诞生。
与 Kafka 比起来,RocketMQ 很多方面都极其相似。唯一的不同是 RocketMQ 对于业务特性的支持更完善,所以更适用于业务场景。
从上面的表格我们可以看出几个简单的结论:
-
无论是在单机吞吐量还是可用性方面,ActiveMQ和RabbitMQ都差不多,而RocketMQ和Kafka差不多。
-
在功能特性方面,ActiveMQ、RabbitMQ、RocketMQ功能比较完善。Kafka功能性较弱。