rabbitmq exchange类型

RabbitMQ-Exchange类型
Exchange概念
Exchange:交互机,根据路由键转发消息到绑定的队列
rabbitmq exchange类型

服务器发送消息不会直接发送到队列中(Queue),而是直接发送给交换机(Exchange),然后根据确定的规则,RabbitMQ将会决定消息该投递到哪个队列。这些规则称为路由键(routing key),队列通过路由键绑定到交换机上。消息发送到服务器端(broker),消息也有自己的路由键(也可以是空),RabbitMQ也会将消息和消息指定发送的交换机的绑定(binding,就是队列和交互机的根据路由键映射的关系)的路由键进行匹配。如果匹配的话,就会将消息投递到相应的队列

  • Direct Exchange:将消息中的Routing key与该Exchange关联的所有Binding中的Routing key进行比较,如果相等,则发送到该Binding对应的Queue中。
  • Topic Exchange:将消息中的Routing key与该Exchange关联的所有Binding中的Routing key进行对比,如果匹配上了,则发送到该Binding对应的Queue中。
  • Fanout Exchange:直接将消息转发到所有binding的对应queue中,这种exchange在路由转发的时候,忽略Routing key。
  • Headers Exchange:将消息中的headers与该Exchange相关联的所有Binging中的参数进行匹配,如果匹配上了,则发送到该Binding对应的Queue中。

direct 类型的exchange
此类型的exchange路由规则很简单:exchange在和queue进行binding时会设置routingkey
在direct类型的exchange中,只有这两个routingkey完全相同,exchange才会选择对应的binging进行消息路由。

rabbitmq exchange类型
rabbitmq exchange类型
Topic类型的exchange
rabbitmq exchange类型

rabbitmq exchange类型
消息发送到topic类型的exchange上时不能随意指定routing_key(一定是指由一系列由点号连接单词的字符串,单词可以是任意的,但一般都会与消息或多或少的有些关联)。Routing key的长度不能超过255个字节。
Binding key也一定要是同样的方式。Topic类型的exchange就像一个直接的交换:一个由生产者指定了确定routing key的消息将会被推送给所有Binding key能与之匹配的消费者。然而这种绑定有两种特殊的情况:

*(星号):可以(只能)匹配一个单词
#(井号):可以匹配多个单词(或者零个)

  1. quick.orange.rabbit 为routing key的消息将会推送到Q1和Q2两个queue上
  2. lazy.orange.elephant 的消息同样会被推送到Q1和Q2上
  3. quick.orange.fox 的消息只会推送到Q1队列上
  4. lazy.brown.fox 的消息会被推送到Q2上
  5. lazy.pink.rabbit 消息也会被推送到Q2上

如果在发送消息时所指定的exchange和routing key在消费者端没有对应的exchange和binding key与之绑定的话,那么这条消息将会被丢弃掉。例如:“orange"和"quick.orange.male.rabbit”。但是routing为”lazy.orange.male.rabbit”的消息,将会被推到Q2上。

Topic类型的exchange是很强大的,也可以实现其它类型的exchange。
当一个队列被绑定为binding key为”#”时,它将会接收相匹配的所有的消息,此时和fanout类型的exchange很像。
当binding key不包含”*”和”#”时,这时候就很像direct类型的exchange。

Fanout 类型 Exchange
rabbitmq exchange类型
直接将消息转发到所有binding的对应queue中,这种exchange在路由转发的时候,忽略Routing key。
Fanout Exchange这种exchange效率最高,fanout > direct > topic
定义一个Fanout类型的Exchange,绑定了一些队列,发送的时候全部队列都能收到消息,而与其bind或者发送消息指定的Routing key无关。

1、可以理解为路由表的模式
2、这种模式不需要RouteKey
3、这种模式需要提前将Exchange与Queue进行绑定,一个Exchange可以绑定多个Queue,一个Queue可以同多个Exchange进行绑定。
4、如果接受到消息的Exchange没有与任何Queue绑定,则消息会被抛弃。

Headers Exchange

将消息中的headers与该Exchange相关联的所有Binging中的参数进行匹配,如果匹配上了,则发送到该Binding对应的Queue中.
匹配规则:
如果Binding中的
x-match = all:表示所有的键值对都匹配才能转发到消息。
x-match = any: 表示只要有键值对匹配就能转发消息。