rabbitmq 消息转发模式

前言

在rabbitmq中,支持多种Exchange转发模式,包括Direct-Exchange,Fanout-Exchange,Topic-Exchange,Headers-Exchange四种转发模式。下面将一一介绍这四种转发模式的特点及区别。

Direct-Exchange

image

转发规则:完全匹配路由键routkey,只有当消息发送的routkey完全匹配queue绑定的key时,exchange才转发消息到该队列。

Fanout-Exchange

image

转发规则:不处理路由键routkey,只需要简单的将队列绑定到交换机上。发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。

Topic-Exchange

image

转发规则:模糊匹配路由键routkey,模糊匹配成功则exchange转发消息到匹配成功的队列。

“*”:表示一个关键字;

“#”:表示0个或若干个关键字;

其中routkey是由多个关键字以点号分隔,构成的字符串(最大255字节)。
例如:quick.orange.rabbit;quick.orange.*;quick.orange.#;

quick.orange.*:可以匹配quick.orange.log;quick.orange.any;…等等

quick.orange.#:可以匹配quick.orange;quick.orange.log;quick.orange.log.error;…等等

Headers-Exchange

image

Message 1 is delivered to Queue A - by default x-match=all;

Message 2 is delivered to Queue A and Queue B - the queue is configured to match any;

Message 3 is not delivered to any queue - the queue is configured to match all;

转发规则:使用消息头代替 routing key 作为关键字进行路由。根据消息头中的多个属性值进行路由转发,而忽略路由键routkey属性,如果消息头中属性的值等于设置bind时指定的值,则认为匹配成功,Headers-Exchange将消息转发到此队列中。其中路由属性值不必是字符串,可以是例如整数或散列(字典)等。

通过修改消息头中的参数”x-match”值来调整匹配规则,默认是all:

x-match=any: 消息头中多个属性中的一个值与bind设置的相等则匹配成功;

x-match=all: 消息头中多个属性中的所有值与bind设置的相等则匹配成功;

总结

如果在exchange中进行消息转发时,无法匹配到queue,则丢弃该消息。

参考链接

  1. https://www.rabbitmq.com/tutorials/amqp-concepts.html
  2. https://www.cloudamqp.com/blog/2015-09-03-part4-rabbitmq-for-beginners-exchanges-routing-keys-bindings.html
  3. http://previous.rabbitmq.com/v3_4_x/tutorials/tutorial-four-java.html
  4. http://previous.rabbitmq.com/v3_4_x/tutorials/tutorial-five-java.html