当前位置: 首页 > 科技观察

RabbitMQ是如何实现消息路由的?

时间:2023-03-13 20:54:26 科技观察

1。WorkflowRabbitMQ是一个基于AMQP协议的分布式消息中间件。AMQP的具体工作机制是生产者将消息发送到RabbitMQBroker上的Exchange交换机。Exchange交换机将接收到的消息按照路由规则发送到绑定的队列(Queue)中。最后将消息传递给订阅该队列的消费者,从而完成消息的异步通信。其中,Exchange交换机可以为消息定义路由规则,将消息路由到指定的队列。那么Queue队列就是消息的载体,每条消息都可以根据路由规则被路由到一个或多个队列中。2.路由策略完成RabbitMQ消息路由的核心组件是Exchange。消息的路由由Exchange类型和Binding决定。Binding是指在Queue和Exchange之间建立一个绑定关系,每一个绑定关系都会有一个BindingKey。这样,就相当于在Exchange中建立了一个路由关系表。生产者发送消息时,需要声明一个RoutingKey(路由键)。Exchange得到RoutingKey后,将RoutingKey与路由表中的BindingKey进行匹配,匹配规则由Exchange类型决定。在RabbitMQ中,默认有四种Exchange类型:Direct、Fanout、Topic和Header。Direct称为直连,即完全匹配方式,要求RoutingKey和BindingKey完全一致,相当于点对点发送。如图:如果发送一条routingkey为“spring”的消息,只有第一个队列能收到消息。主题:称为主题。这种方式是通过设置通配符来动态匹配的,相当于正则表达式。就是用RoutingKey来匹配BingingKey。BingingKey支持两种通配符。表示匹配0个或多个词*表示匹配不超过1个词此外,BingingKey用点分隔两个词。使用*表示使用正则表达式进行匹配,如图:Topic类型开关绑定了4个队列,使用了不同的绑定键。如果发送路由键为“junior.abc.jvm”的消息,只有第一个队列可以接收到。如果你发送一条routingkey为“senior.netty”的消息,那么第二个队列和第三个队列都能收到。Fanout:称为广播,这种方式不需要设置RoutingKey,而是将消息广播到当前Exchange绑定的所有队列。如图:只要将消息发送到FanoutExchange,三个队列都能收到消息。RabbitMQ、Kafka、RocketMQ是目前最主流的分布式消息中间件。有的同学可能对Kafka比较了解,有的同学可能对RabbitMQ比较了解。但是在面试的时候,面试官一般会问到你用过的技术组件。通过面试过程推导出你的学习能力和对技术的掌握程度。如果这方面不错的话,接触一个新的MQ组件消耗的学习成本会比较小。