目录
1. 模型简介
在之前的模式中,我们创建了一个工作队列。 工作队列背后的假设是:每个任务只被传递给一个工作人员。 在这一部分,我们将做一些完全不同的事情 - 我们将会传递一个信息给多个消费者。 这种模式被称为“发布/订阅”。
和前两个的模型结构不同,在发布订阅模型中多了一个X(exchange),exchange是一个交换机,生产者不是直接将消息发送给队列,而是先发送给交换机。消费者可以通过队列去订阅这个交换机,每个消费者对应于自己的一个队列。
这个结构就好像我们订阅微信公众号一样,作者将文章发送到自己的公众号上,只有订阅过该公众号的人才能收到消息。因此这个模型被称为发布-订阅模型。
1个生产者,多个消费者
每一个消费者都有自己的一个队列
生产者没有将消息直接发送到队列,而是发送到了交换机
每个队列都要绑定到交换机
生产者发送的消息,经过交换机到达队列,实现一个消息被多个消费者获取的目的
2. 交换机X(Exchanges)
2.1 X(Exchanges)定义
交换机一方面:接收生产者发送的消息。另一方面:知道如何处理消息,例如递交给某个特别队列、递交给所有队列、或是将消息丢弃。到底如何操作,取决于Exchange的类型。
Exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失!
2.2 Exchange类型
Fanout:广播,将消息交给所有绑定到交换机的队列
Direct:定向,把消息交给符合指定routing key 的队列
Topic:通配符,把消息交给符合routing pattern(路由模式) 的队列
- headers
:
根据header匹配,在发布消息的时候就需要传入header值,其中的header就是binding时的arguments参数
一般来说direct和topic用来具体的路由消息,如果要用广播的消息一般用fanout的exchange。
header类型用的比较少,但还是知道一点好。
2.2.1 direct类型
此类型的exchange路由规则很简单:
exchange在和queue进行binding时会设置routingkey
在direct类型的exchange中,只有这两个routingkey完全相同,exchange才会选择对应的binging进行消息路由。
具体的流程如下:
2.2.2 topic类型
此类型exchange和上面的direct类型差不多,但direct类型要求routingkey完全相等,这里的routingkey可以有通配符:'*','#'.
其中'*'表示匹配一个单词, '#'则表示匹配没有或者多个单词
如上图第一个binding:
- exchange: agreements
- queue A: berlin_agreements
- binding routingkey: agreements.eu.berlin.#
第二个binding:
- exchange: agreements
- queue B: all_agreements
- binding routingkey: agreements.#
第三个binding:
- exchange: agreements
- queue c: headstore_agreements
- binding routingkey: agreements.eu.*.headstore
所以如果我们消息的routingkey为agreements.eu.berlin那么符合第一和第二个binding,但最后一个不符合,具体的代码如下:
2.2.3 fanout类型
此exchange的路由规则很简单直接将消息路由到所有绑定的队列中,无须对消息的routingkey进行匹配操作。
直接将消息路由到所有绑定的队列中,无须对消息的routingkey进行匹配操作。即交换机将消息从生产者获取之后,直接发给订阅的队列。
2.2.4 header类型
此类型的exchange和以上三个都不一样,其路由的规则是根据header来判断,其中的header就是以下方法的arguments参数:
在发布消息的时候就需要传入header值,其中的header就是binding时的arguments参数
总结
2.3 交换机在管理界面