专栏首页陈树义消息中间件系列第2讲:如何进行消息队列选型?

消息中间件系列第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

吞吐量、可用性超高

规模超大的非业务场景(大型公司的非业务场景)

总结

本文讲了下面几个要点:

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

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

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

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

参考资料

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java并发编程:阻塞队列

    Java并发编程:阻塞队列   在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、...

    陈树义
  • 集合系列 Set(八):TreeSet

    TreeSet 是 Set 集合的红黑树实现,但其内部并没有具体的逻辑,而是直接使用 TreeMap 对象实现。我们先来看看 TreeSet 的定义。

    陈树义
  • MySQL用户管理:添加用户、授权、删除用户

    添加用户 以root用户登录数据库,运行以下命令: create user zhangsan identified by 'zhangsan'; 上面的命令创...

    陈树义
  • istio 庖丁解牛(三) galley

    今天我们来解析istio控制面组件Galley. Galley Pod是一个单容器单进程组件, 没有sidecar, 结构独立, 职责明确.

    钟华
  • Golang包——time

    毫秒和纳秒是两的时间单位 1秒=1000毫秒 1毫秒=1000微秒 1微秒=1000纳秒

    羊羽shine
  • React Native - 开发工具Atom+Nuclide

    Atom 是 Github 开源的文本编辑器,这个编辑器完全是使用Web技术构建的(基于Node-Webkit)。启动速度快,提供很多常用功能的插件和主题,可以...

    赵哥窟
  • 程序员的江湖

    一 小D是一名九零后程序员, 身高超过一米九, 是程序员中的长人,每一个新接触到他的同事都会为他的身高所惊骇:长这么高,当什么程序员啊,应该去打篮球 小D在大学...

    用户1608022
  • ffplay源码分析2-数据结构

    栈(LIFO)是一种表,队列(FIFO)也是一种表。数组是表的一种实现方式,链表也是表的一种实现方式,例如FIFO既可以用数组实现,也可以用链表实现。Packe...

    用户4940323
  • 结合案例深入解析迭代器模式

    如果我们需要统一遍历不同的集合(容器),也可以利用迭代器模式解决(下面的案例就是解决这个问题)。

    李红
  • 结合案例深入解析迭代器模式

    如果我们需要统一遍历不同的集合(容器),也可以利用迭代器模式解决(下面的案例就是解决这个问题)。

    李红

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动