这是我参与更文挑战的第6天,活动详情查看: 更文挑战
我们之前的rabbitMQ的模式都是不存在交换机的,直接发送到队列,将下来讲的是订阅模型,一次像多个消费者发消息
一个生产者发送消息到交换机,交换机发给绑定在自己上边的队列,消费者在从队列拿到消息消费,
X(Exchange):交换机接受生产者发送的消息,另一方面知道如何处理消息,,发给某个队列,还是发给所有的队列,或者是直接舍弃,取决于交换机是如何配置的,交换机只负责发送,而不去存储消息。
交换机分为几类
1 | js复制代码Publish/Subscribe:广播,将消息交给所有绑定到交换机的队列 |
订阅模型–Publish/Subscribe
在广播模式下,消息发送流程是这样的:
- 1) 可以有多个消费者
- 2) 每个消费者有自己的queue(队列)
- 3) 每个队列都要绑定到Exchange(交换机)
- 4) 生产者发送的消息,只能发送到交换机,交换机来决定要发给哪个队列,生产者无法决定。
- 5) 交换机把消息发送给绑定过的所有队列
- 6) 队列的消费者都能拿到消息。实现一条消息被多个消费者消费
生产者
生产者声明交换机,不在声明队列,消息发送到交换机,比在发送到队列
1 | java复制代码public class p1 { |
消费者1
1 | java复制代码public class c1 { |
消费者2
1 | java复制代码public class c2 { |
启东消费者,生产者发送一条消息,看输出
Routing–有选择的发送消息
订阅模式,在这个中我们可以做到不同的队列接受不同的消息,队列与交换机绑定必须指定,消息发送时也必须指定发送消息的routingKey
如上图所示生产者生产消息发送到交换机,交换机通过与rontingkley的匹配的队列发送消息。
生产者–分别发送三次不同的消息,匹配不同的routingkey
1 | java复制代码public class p { |
消费者insert
1 | java复制代码public class insert { |
消费者delect
1 | java复制代码public class delect { |
消费者update
1 | java复制代码public class update { |
看控制台输出,可以看到,绑定了不同routingkey的收到不同的消息,每个队列可以有很多个routingkey
topic–
不同于Direct
的交换机,topic匹配可以通过通配符
Routingkey
一般都是有一个或多个单词组成,多个单词之间以”.”分割
1 | js复制代码*(星号)可以正好代替一个词。 |
生产者
1 | java复制代码public class p { |
消费者1 只接收insert和delect
1 | java复制代码public class c1 { |
消费者2 只要匹配到 goods.全拿下
1 | java复制代码public class c2 { |
运行发送推广三条消息,看控制台输出
完美、
本文转载自: 掘金