RabbitMQ的消息如何实现路由
工作机制
RabbitMQ是一个基于AMQP协议实现的一个分布式消息中间件,AMQP的一个具体工作机制非常简单:
生产者把消息发送到RabbitMQ的Broker上的一个Exchange交换机上,然后一个Exchange交换机把收到的消息根据路由的规则发送到绑定的队列里面。最后把这个消息投递给订阅了这个队列的消费者,从而去实现消息的一个异步通讯。
其中Exchange是一个消息交换机,它里面定义了消息的路由规则。也就是说这个消息路由到哪个队列,然后Queue表示这个消息一个载体,每个消息可以根据路由规则路由到一个或者多个Queue里面。
而关于消息的一个路由机制,核心的组件是Exchange,它负责接收生产者的消息,然后把消息路由到消息队列里面。
BindingKey
消息路由规则是由ExchangeType和Binding来决定的。Binding表示建立Queue和Exchange之间的一个绑定关系。每个绑定关系会存在一个BindingKey,通过这种方式相当于在Exchange里面去建立了一个路由关系表。
RoutingKey
生产者在发送消息的时候需要声明一个routingKey。Exchange拿到routingKey以后,根据routingKey和路由表里面的BindingKey进行一个匹配,匹配的方式是根据ExchangeType来决定的。
Exchange Type
在RabbitMQ中有三种类型的Exchange type,分别是direct、fanout和topic:
- direct表示完整的匹配,也就是说routing和Bingding Key完全一致,相当于点对点的发送。
- fanout表示广播机制,这种方式不会基于Routing Key来进行匹配,而是把消息广播到当前Exchange上面的所有队列上。
- topic表示正则表达式匹配。它会根据routing key使用正则表达式去匹配BindingKey。符合匹配规则的Queue都会收到这个消息。
参考资料:RabbitMQ的消息如何实现路由