作者:爱钓鱼的桌子哥,阿里巴巴高级技术专家

目录

(1)流派1:有Broker的暴力路由

(2)流派2:有Broker的复杂路由

(3)流派3:无Broker的通信流派

(4)总结

作者:爱钓鱼的桌子哥,资深架构师

平时经常会看到很多人写文章分析Kafka、RabbitMQ、RocketMQ等各种MQ之间的性能比较,功能比较,但是实际上从MQ消息队列的门派上来说,这些MQ其实是分属不同的门派的。

那么这不同的门派之间,到底有什么区别呢?

(1)流派1:有Broker的暴力路由

这个流派最典型的就是Kafka了,Kafka实际上为了提升性能,简化了MQ功能模型,仅仅提供了一些最基础的MQ相关的功能,但是大幅度优化和提升了吞吐量。

首先,这个流派一定是有一个Broker角色的,也就是说,Kafka需要部署一套服务器集群,每台机器上都有一个Kafka Broker进程,这个进程就负责接收请求,存储数据,发送数据。

Kafka的生产消费模型做的相对是比较暴力简单的,就是简单的数据流模型。

简单来说,他有一个概念,叫做“Topic”,你可以往这个“Topic”里写数据,然后让别人从这里来消费。

这个Topic可以划分为多个Partition,每个Partition放一台机器上,存储一部分数据。

在写消息到Topic的时候,会自动把你这个消息给分发到某一个Partition上去。

然后消费消息的时候,有一个Consumer Group的概念,你部署在多台机器上的Consumer可以组成一个Group,一个Partition只能给一个Consumer消费,一个Cosumer可以消费多个Partition,这是最最核心的一点。

通过这个模型,保证一个Topic里的每条消息,只会交给Consumer Group里的一个Consumer来消费,形成了一个Queue(队列)的效果。

假如你想要有一个Queue的效果,也就是希望不停的往Queue里写数据,然后多个消费者消费,每条消息就只能给一个消费者,那么通过Kafka来实现,其实就是生产者写多个Partition,每个Partition只能给Consumer Group中的一个Consumer来消费。如下图所示:

如果要实现Publish/Subscribe的模型呢?就是说生产者发送的每条消息,都要让所有消费都消费到,怎么实现?

那就让每个消费者都是一个独立的消费组,这样每条消息都会发送给所有的消费组,每个消费组里那唯一的一个消费者一定会消费到所有的消息。

但是除此之外,Kafka就没有任何其他的消费功能了,就是如此简单,所以属于一种比较暴力直接的流派。

它就是简单的消费模型,实现最基础的Queue和Pub/Sub两种消费模型,但是内核中大幅度优化和提升了性能以及吞吐量。

所以Kafka天生适合的场景,就是大数据领域的实时数据计算的场景。

因为在大数据的场景下,通常是弱业务的场景,没有太多复杂的业务系统交互,而主要是大量的数据流入Kafka,然后进行实时计算。

所以就是需要简单的消费模型,但是必须在内核中对吞吐量和性能进行大幅度的优化。

因此Kafka技术通常是在大数据的实时数据计算领域中使用的,比如说每秒处理几十万条消息,甚至每秒处理上百万条消息。

(2)流派2:有Broker的复杂路由

第二个流派,就是RabbitMQ为代表的流派,他强调的不是说如何提升性能和吞吐量,关注的是说要提供非常强大、复杂而且完善的消息路由功能。

所以对于RabbitMQ而言,他就不是那么简单的Topic-Partition的消费模型了。

在RabbitMQ中引入了一个非常核心的概念,叫做Exchange,这个Exchange就是负责根据复杂的业务规则把消息路由到内部的不同的Queue里去。

举个例子,如果要实现最简单的队列功能,就是让exchange往一个queue里写数据,然后多个消费者来消费这个queue里的数据,每条消息只能给一个消费者,那么可以是类似下面的方式。

如果想要实现Pub/Sub的模型,就是一条消息要被所有的消费者给消费到,那么就可以让每个消费者都有一个自己的Queue,然后绑定到一个Exchange上去。

接着,这个Exchange就设定把消息路由给所有的Queue即可,如下面这样。

此时Exchange可以把每条消息都路由给所有的Queue,每个Consumer都可以从自己的Queue里拿到所有的消息。

RabbitMQ这种流派,其实最核心的是,基于Exchange这个概念,他可以做很多复杂的事情。

比如:如果你想要某个Consumer只能消费到某一类数据,那么Exchange可以把消息里比如带“XXX”前缀的消息路由给某个Queue。或者你可以限定某个Consumer就只能消费某一部分数据。总之在这里你可以做很多的限制,设置复杂的路由规则。

但是也正是因为引入了这种复杂的消费模型,支持复杂的路由功能,导致RabbitMQ在内核以及架构设计上没法像Kafka做的那么的轻量级、高性能、可扩展、高吞吐,所以RabbitMQ在吞吐量上要比Kafka低一个数量级。

所以这种流派的MQ,往往适合用在Java业务系统中,不同的业务系统需要进行复杂的消息路由。

比如说业务系统A发送了10条消息,其中3条消息是给业务系统B的,7条消息是给业务系统C的,要实现这种复杂的路由模型,就必须依靠RabbitMQ来实现。

当然,对于这种业务系统之间的消息流转而言,可能不需要那么高的吞吐量,可能每秒业务系统之间也就转发几十条或者几百条消息,那么就完全适合采用RabbitMQ来实现。

(3)流派3:无Broker的通信流派

ZeroMQ代表的是第三种MQ。说白了,他是不需要在服务器上部署的,就是一个客户端的库而已。

也就是说,他主要是封装了底层的Socket网络通讯,然后一个系统要发送一条消息给另外一个消息消费 。

通过ZeroMQ,本质就是底层ZeroMQ发送一条消息到另外一个系统上去。

所以ZeroMQ是去中心化的,不需要跟Kafka、RabbitMQ一样在服务器上部署的。

他主要是用来进行业务系统之间的网络通信的,有点类似于比如你是一个分布式系统架构,那么此时分布式架构中的各个子系统互相之间要通信,你是基于Dubbo RPC?还是Spring Cloud HTTP?

可能上述两种你都不想要,就是要基于原始的Socket进行网络通信,简单的收发消息而已。

此时就可以使用ZeroMQ作为分布式系统之间的消息通信,如下面那样。

(4)总结

其实现在基本上MQ主要就是这三个流派,很多小众的MQ一般很少有人会用。

而且用MQ的场景主要就是两大类:

  1. 业务系统之间异步通信
  2. 大数据领域的实时数据计算

所以一般业务系统之间通信就是会采用RabbitMQ/RocketMQ,需要复杂的消息路由功能的支撑。

大数据的实时计算场景会采用Kafka,需要简单的消费模型,但是超高的吞吐量。

至于ZeroMQ,一般来说,少数分布式系统中子系统之间的分布式通信时会采用,作为轻量级的异步化的通信组件。

作者简介:

爱钓鱼的桌子哥,资深架构师

原文链接:https://juejin.im/post/5ccffb0551882540ab16802b

作者先后工作于滴滴、百度、字节跳动等国内一线互联网大厂,从事基础架构相关工作。带领团队设计与构建了大规模的分布式存储系统、分布式消息中间件、分布式数据库,对分布式架构设计、系统高可用体系构建、基础中间件架构都有丰富的经验。

PK光明顶?江湖上流传的几大消息队列门派,到底有什么本质的区别相关推荐

  1. c++ createtoolhelp32snapshot取进程路径_Linux进程间通信(上)之管道、消息队列实践

    1.进程间通信简述 进程间通信的几种方式:无名管道.有名管道.消息队列.共享内存.信号.信号量.套接字(socket). 进程间通信是不同进程直接进行的一些接触,这种接触有简单,有复杂.机制不同,复杂 ...

  2. 幽你一默:江湖上流传只有程序猿才懂的幽默

    亲试只有程序猿知道的梗 1.一程序员去面试,面试官问:"你毕业才两年,这三年工作经验是怎么来的?!"程序员答:"加班." 2.某程序员对书法十分感兴趣,退休后决 ...

  3. 阿里云消息队列Kafka商业化:支持消息无缝迁移到云上

    摘要: 7月25日,阿里云宣布正式推出消息队列Kafka,全面融合开源生态.在兼容Apache生态的基础上,阿里云消息队列Kafka彻底解决了开源产品稳定性不足的痛点,可用性达99.9%,数据可靠性9 ...

  4. 大型网站系统架构系列:分布式消息队列(二)

    四.JMS消息服务 讲消息队列就不得不提JMS .JMS(JAVA Message Service,java消息服务)API是一个消息服务的标准/规范,允许应用程序组件基于JavaEE平台创建.发送. ...

  5. 消息中间件系列第2讲:如何进行消息队列选型?

    要做技术选型,那么必须对现今的各个消息中间件有个深入的理解才能做技术选型.否则别人问你,你为什么要用这个消息中间件,你说不出个所以然来,怎么做架构师呢? 截止到目前为止,现在业界流行的消息队列中间件有 ...

  6. 消息队列—经典5连问—你能抗几道?

    作者:熬夜不加班 链接:https://www.jianshu.com/p/2f57f4f43508 面试题1:说说你对消息队列的理解,消息队列为了解决什么问题? 追问1:消息队列有什么优缺点 面试题 ...

  7. 消息队列面试连环问:如何保证消息不丢失?处理重复消息?消息有序性?消息堆积处理?...

    大家好,我是 yes. 最近我一直扎在消息队列实现细节之中无法自拔,已经写了 3 篇Kafka源码分析,还剩很多没肝完.之前还存着RocketMQ源码分析还没整理.今儿暂时先跳出来盘一盘大方向上的消息 ...

  8. “简单”的消息队列与kafka

    小时候就特别喜欢龙系精灵,特别是乘龙,后来才知道只是冰水...尴尬. 在宠物小精灵中,乘龙一直是训练家的载人伙伴,和我们下面的MQ好像有几分相似呢~~ 前言 MQ,全称消息队列,现在市面上有很多种消息 ...

  9. rabbitmq实战:高效部署分布式消息队列_一文看懂消息队列中间件--AMQ及部署介绍...

    概述 最近有个小项目用到了AMQ来做消息队列,之前介绍的主要是rabbitmq,所以今天主要提一下AMQ,也简单介绍下两者的区别~ 消息队列中间件 消息队列中间件(简称消息中间件)是指利用高效可靠的消 ...

最新文章

  1. python初学之魔法方法1
  2. Mac OS X Git安装教程
  3. win10x64下的redis安装与使用
  4. yii框架安装及环境配置!!!
  5. 合成孔径雷达_合成孔径雷达(SAR)基础:汇总
  6. NBT:你想成为计算生物学家?
  7. HttpClient中异步方法的同步调用
  8. html5和css3打造一款创意404页面
  9. 月薪7万,还想着赚“外快”,吃百万回扣, 这名大公司85后员工结局唏嘘
  10. html图标反色,Html5 反色 及其 透明 效果
  11. BZOJ 3779 LCT 线段树 DFS序 坑
  12. MySQL8.0数据库配置注意事项
  13. WEB-互补色与对比色的计算与获取 (实用、赞)
  14. 如何在计算机添加打印机驱动程序,教你如何安装打印机驱动程序
  15. 哪里有免费的ASP空间?
  16. 使用计算机时按什么键打开,计算机进入BIOS的快捷键是什么|打开计算机以进入BIOS设置时按下的键...
  17. 极客时间专栏内容的个人分析
  18. 2021年中国亚马逊耳环市场趋势报告、技术动态创新及2027年市场预测
  19. 小松鼠邮件服务器搭建(很简单的哦!)
  20. 两个坐标系转换的变换矩阵

热门文章

  1. 餐饮管理系统论文php,餐饮管理系统设计
  2. 计算机园林辅助设计答案,园林计算机辅助设计 [常会宁编] 2010年版
  3. 网站下的robots
  4. 回归问题的置信区间AUC_互助问答第193期:倾向得分匹配法与面板数据问题
  5. 《C Primer Plus》6.15 复习题
  6. 【网络爬虫】给关键字获取百度知道搜索数据的网络爬虫
  7. 郑州轻工业大学 python1024: 计算字母序号
  8. 计算机应用类型分类 余额宝属于,按计算机应用的类型分类,余额宝属于( ) 。...
  9. 职场中如何跟同事相处?
  10. oracle DGMGRL ORA-16603报错的解决方法(DG Broker)