熟练掌握各种MQ?那面试官很可能用这道题目先摸摸你的老底!

目录

1.有Broker的暴力路由:Kafka

2.有Broker的复杂路由:RabbitMQ   

3.无Broker的通信流派:ZeroMQ

4.总结

写在前面   

我们知道,目前市面上的MQ包括Kafka、RabbitMQ、ZeroMQ、RocketMQ等等。

那么他们之间究竟有什么本质区别,分别适用于什么场景呢?

上述抛出的问题,同样在不少公司的Java工程师面试中出现,特别是当你简历上的技术栈包含了这些技术,面试官往往喜欢用这个问题,对你进行摸底考察。

本文我们就一起来探讨一下。

(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)有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)无Broker的通信流派

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

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

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

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

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

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

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

(4)总结

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

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

业务系统之间异步通信

大数据领域的实时数据计算

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

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

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

END


如果你在学习Java的过程中遇见什么问题或者想获取一些学习资源的话欢迎加入团长的Java学习交流QQ群:815220368 ,可免费领取资料

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容