前言
上一篇文章对mq做了简介,并且说了rabbitmq的六种模式,这篇文章主要记录一下这几种模式是什么样的,以及怎么用的。第一种不再说,跟简单。
一下几种模式均有对应的案列代码供参考,请看https://github.com/Coderxiangyang/Rabbitmq/tree/master/rabbitmq-01-hello
work queues模式
这种模式和hello world模式差不多,只不过是多个消费端,主要是应对消息太多,处理不过来的情况。多个消费端可以共同消费一个队列中的消息,他们的关系是竞争关系。
发布订阅模式
与work queues模式相比,此模式又多了一个角色。Exchange:交换机,每个消费者监听自己的队列,生产者将消息发给 broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收 到消息,此方法也成为交换机的广播类型。所以记住这个模式的特殊点就是 新增交换机,交换机会把消息广播到与其绑定的所有队列
交换机的几种类型
- Fanout:广播,将消息交给所有绑定到交换机的队列 (发布订阅模式)
- Direct:定向,把消息交给符合指定 routing key 的队列
- Topic:通配符,把消息交给符合 routing pattern 的队列(路由模式)
Exchange (交换机)只负责转发消息,不具备存储消息的能力,如果没有任何队列与 Exchange 绑定,或者没有符合路由队列,那么消息会丢失!
声明交换机的时候,去指定交换机是什么类型的、
可以在rabbitmq图形化界面查看当前exchange绑定的队列
Routing 路由模式
路由模式和上面的发布订阅模式不太一样,应该说数据的传输更加严格,一个交换机绑定多个队列,每一个队列有route key,在绑定是,key也需要绑定,发送消息时,也要指定将此消息发送到那个route key,也就是说,此消息发出去,只有一个队列可以消费,其他队列消费不了。
如图:一个交换机绑定了两个队列。
生产者发送了两条消息
两个消费者分别消费一条消息,谁也代替不了谁。
Topics 通配符模式
上面的路由模式,有点死板,一个生产者只能跟一个队列对应,Topics 通配符模式跟上面的不同是,可以通过通配符的方式,指定这个exchange中的消息由哪些队列消费。
Routingkey 一般都是有一个或多个单词组成,多个单词之间以”.”分割,例如: item.insert
#:匹配一个或多个词
* :匹配不多不少恰好 1 个词
举例:
item.# :能够匹配 item.insert.abc 或者 item.insert,即item开头,后面带一个或者多个单词都可以
item. :只能匹配 item.insert或者是item.update,即item开头,后面带一个单词
或者是:
#.item:以item结尾的toute key 都可以匹配
*.item:以item结尾,前面有一个词的,都可以匹配
例如:生产者是这样发送消息的,四条消息。
队列是这样绑定的
启动消费者代码:结果是这样的
就是说*只适配了route key为item.insert和item.update的通道。
总结
- 简单模式 HelloWorld 一个生产者,一个消费者,不需要设置交换机
- 工作队列模式 Work Queue 一个生产者、多个消费者(竞争关系),不需要设置交换机(使用默认的交换机)
- 发布订阅模式 Publish/subscribe 需要设置类型为 fanout 的交换机,生产者生产消息,然后通过广播的方式。与交换机绑定的队列都可以消费消息
- 路由模式 Routing 需要设置类型为 direct 的交换机,交换机与队列绑定,并且指定route key,生产者生产消息,对饮toute key的队列消费消息
- 通配符模式 Topic 需要设置类型为 topic 的交换机,交换机和队列进行绑定,并且指定通配符方式的 routing key,生产者生产消息,交换机通过 routing key及其通配符,发送到对应的队列中,然后消费消息。
有些情况下,交换机可不绑定队列,如topic模式下,手动建立也可以,生产者根据已经存在的route key去发送对应消息到队列中,但是如果不手动建立的话,也不在代码中绑定交换机和队列的关系的话,代码启动就会报错。