为什么80%的码农都做不了架构师?>>>
1、Hello Word模式
Hello Word模式他会发送数据到空字符的交换机,这种交换机很特殊,它允许我们准确地指定消息应该去哪个队列。需要在routing_key参数中指定队列名称。
2、Work Queues模式
Work Queues模式其实就是在Hello Word模式变成了多个消费者,不会消费同一条消息。
3、Publish/Subscribe模式(fanout模式)
Publish/Subscribe模式其实就是将队列绑定到交换机,数据进入交换机然后在决定进入哪个队列,绑定2个就会进入2个队列,类似广播性质。此模式也就是Exchange模式中的fanout模式。
上图中,生产者(P)发送到Exchange(X)的所有消息都会路由到图中的两个Queue,并最终被两个消费者(C1与C2)消费。
4、Routing模式
Routing模式它会把消息路由到那些binding key与routing key完全匹配的Queue中,此模式也就是Exchange模式中的direct模式。
以上图的配置为例,我们以routingKey="error"发送消息到Exchange,则消息会路由到Queue1(amqp.gen-S9b…,这是由RabbitMQ自动生成的Queue名称)和Queue2(amqp.gen-Agl…)。如果我们以routingKey="info"或routingKey="warning"来发送消息,则消息只会路由到Queue2。如果我们以其他routingKey发送消息,则消息不会路由到这两个Queue中。
5、Topics模式
Topics模式与Routing模式比较相近,routing key为一个句点号“. ”分隔的字符串(我们将被句点号“. ”分隔开的每一段独立的字符串称为一个单词),binding key与routing key一样也是句点号“. ”分隔的字符串。binding key中可以存在两种特殊字符“*”与“#”,用于做模糊匹配,其中“*”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)。
以上图中的配置为例,routingKey=”quick.orange.rabbit”的消息会同时路由到Q1与Q2,routingKey=”lazy.orange.fox”的消息会路由到Q1与Q2,routingKey=”lazy.brown.fox”的消息会路由到Q2,routingKey=”lazy.pink.rabbit”的消息会路由到Q2(只会投递给Q2一次,虽然这个routingKey与Q2的两个bindingKey都匹配);routingKey=”quick.brown.fox”、routingKey=”orange”、routingKey=”quick.orange.male.rabbit”的消息将会被丢弃,因为它们没有匹配任何bindingKey。
6、RPC模式
这个模式很少用,也不多做解释了,就是一个请求队列一个回调队列,具体参考官方网站或者其他博客吧。
交换机4种模式中还有一种模式没叙述,就是headers模式:
headers类型的Exchange不依赖于routing key与binding key的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。
在绑定Queue与Exchange时指定一组键值对;当消息发送到Exchange时,RabbitMQ会取到该消息的headers(也是一个键值对的形式),对比其中的键值对是否完全匹配Queue与Exchange绑定时指定的键值对;如果完全匹配则消息会路由到该Queue,否则不会路由到该Queue。
fanout,direct,topicexchange的routingKey都需要要字符串形式的,而headers exchange则没有这个要求,因为键值对的值可以是任何类型 ,匹配有两种方式all和any。这两种方式是在接收端必须要用键值"x-mactch"来定义。all代表定义的多个键值对都要满足,而any则代码只要满足一个就可以了
参考文档:
http://www.rabbitmq.com/getstarted.html
https://www.2cto.com/kf/201807/764225.html