zoukankan      html  css  js  c++  java
  • 消息中间件系列第2讲:如何进行消息队列选型?

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

    截止到目前为止,现在业界流行的消息队列中间件有: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 吞吐量、可用性超高 规模超大的非业务场景(大型公司的非业务场景)

    总结

    本文讲了下面几个要点:

    • 业界流行框架的介绍
    • 各大消息中间件的对比

    看完之后,你应该能解答下面几个问题:

    • 我的系统要使用哪个消息队列中间件?

    下篇,我们聊聊使用消息队列需要考虑的几个问题。

    参考资料

  • 相关阅读:
    hihoCoder #1176 : 欧拉路·一 (简单)
    228 Summary Ranges 汇总区间
    227 Basic Calculator II 基本计算器II
    226 Invert Binary Tree 翻转二叉树
    225 Implement Stack using Queues 队列实现栈
    224 Basic Calculator 基本计算器
    223 Rectangle Area 矩形面积
    222 Count Complete Tree Nodes 完全二叉树的节点个数
    221 Maximal Square 最大正方形
    220 Contains Duplicate III 存在重复 III
  • 原文地址:https://www.cnblogs.com/chanshuyi/p/message_queue_serial_02_how_to_select.html
Copyright © 2011-2022 走看看