大家好,我是Mic,一个没有才华只能靠颜值混饭吃的Java程序员。
今天分享的这个面试题,没什么特别复杂和特殊的地方。
就是一个RabbitMQ里面的普通面试题;
这个问题一般是去互联网公司里面 去考察3~5年的求职者。
问题是: “RabbitMQ的消息如何实现路由”?
高手部分的回答已经整理到了10W字的面试文档里面,大家可以扫描文章尾端二维码领取。
下面看看高手的回答
需要高手面试文档面试文档的小伙伴可以扫描文章底部二维码
RabbitMQ是一个基于AMQP协议实现的分布式消息中间件。
AMQP的具体工作机制是,生产者把消息发送到RabbitMQ Broker上的Exchange交换机上。
Exchange交换机把收到的消息根据路由规则发给绑定的队列(Queue)。
最后再把消息投递给订阅了这个队列的消费者,从而完成消息的异步通讯。

其中,Exchange是一个消息交换机,它里面定义了消息路由的规则,也就是这个消息路由到那个队列。
然后Queue表示消息的载体,每个消息可以根据路由规则路由到一个或者多个队列里面。
而关于消息的路由机制,核心的组件是Exchange。
它负责接收生产者的消息然后把消息路由到消息队列,而消息的路由规则由ExchangeType和Binding决定。
Binding表示建立Queue和Exchange之间的绑定关系,每一个绑定关系会存在一个BindingKey。
通过这种方式相当于在Exchange中建立了一个路由关系表。

生产者发送消息的时候,需要声明一个routingKey(路由键),Exchange拿到routingKey之后,根据RoutingKey和路由表里面的BindingKey进行匹配,而匹配的规则是通过ExchangeType来决定的。

在RabbitMQ中,有三种类型的Exchange:direct ,fanout和topic。
direct: 完整匹配方式,也就是Routing key和Binding Key完全一致,相当于点对点的发送。
fanout: 广播机制,这种方式不会基于Routing key来匹配,而是把消息广播给绑定到当前Exchange上的所有队列上。
topic: 正则表达式匹配,根据Routing Key使用正则表达式进行匹配,符合匹配规则的Queue都会收到这个消息
RabbitMQ、Kafka、RocketMQ是目前最主流的分布式消息中间件了。
有的同学可能对kafka比较了解,有的同学可能对RabbitMQ比较了解。
不过,在面试的时候,面试官一般会问你用过的技术组件。
通过面试过程中推演出你的学习能力以及对技术的掌握能力,这个方面如果还不错的话,接触一个新的MQ组件所消耗的学习成本会比较小。
另外,我将所有Java面试系列制作成了完整的面试文档。它的便捷之处在于,可以通过检索的方式,找到你想要的面试题,目前已经更新180期,总计超过15W字!