工作模式
1. 简单队列模式(simple queue)
只包含一个生产者和一个消费者 生产者将消息发送到队列中
消费者从队列中接收消息
2. 工作队列模式(work Queues)
一个生产者对应多个消费者, 一条消息只被一个消费者进行消费
工作队列有轮询分发和公平分发两种模式
2.1 平均分配
公平分配,每次只给一个消费者分配一个
ch.Qos(1, 0, false)
3. 发布 - 订阅模式(Publish/SubScribe)
- 一个生产者, 多个消费者
- 每个消费者都有自己的消息队列, 分别绑定到不同的队列上
- 生产者没有把消息发送到队列, 而是发送到交换机上
- 每个队列都需要绑定到交换机上
- 生产者生产的消息先经过交换机然后到达队列, 一个消息可以被多个消费者消费
- 如果消息发送到没有队列绑定的交换机时, 消息将会消失, 因为交换机没有存储消息的能力, 只有队列才有存储消息的能力;
4. 路由模式(routing)
生产者将消息发送到 direct 交换机, 它会吧消息路由到那些 binding key 与 routing key 完全匹配的 queue 中
这样就能实现消费者有选择的去消费消息
5. 主题模式(Tipic)
交换机通过模式匹配分配消息的路由键属性
将路由键和某个模式进行匹配, 此时队列需要绑定到一个模式上, 它将路由键和绑定的字符串切分为单词, 这些单词之间用点隔开 (use.news)
同样也会识别两个通配符, “#” 和 “*”
# 匹配 0 个或者多个单词, * 匹配多个单词
binding key | routing key |
---|---|
logger.# | logger.error logger.info logger.debug |
#.info | logger.info |
交换机类型
参数名 | 类型解释 |
---|---|
direct |
直连交换机 |
fanout |
扇型交换机 |
topic |
主题交换机 |
headers |
头交换机 |
直连交换机
是根据消息携带的路由键(routing key) 将消息投递到对应的队列, 步骤如下:
- 将一个队列绑定到某个交换机上, 同时赋予绑定一个路由键(routing key);
- 当一个携带着路由键值为 R 的消息被发送给直连交换机时, 交换机会把它路由给绑定值同样为 R 的队列
扇形交换机
将消息路由给绑定到它身上的所有队列, 不同于直连交换机, 路由键在此类型上不启任务作用
如果 N 个队列绑定到某个扇形交换机上, 当有消息发送给此扇形交换机时, 交换机会将此消息发送给这所有的 N 个队列
主题交换机
队列通过路由键绑定到交换机上, 然后交换机根据消息里面的路由值, 将消息路由给一个或多个绑定的队列
扇形交换机和主题交换机异同
- 对于扇形交换机 路由键是没有意义的, 只要有消息, 它都发送消息到它所绑定的所有队列上
- 对于主题交换机 路由规则由路由键决定, 只有满足路由键的规则, 消息才可以路由到对应的队列上
头交换机
类似主题交换机, 但是头交换机所有多个消息属性来替代路由键建立路由规则, 通过判断消息头的值能否与指定的绑定相匹配来确立路由规则
此交换机有个重要的参数:x-match
- 当
x-match
为 any 时: 消息头的任意一个值被匹配就可以满足条件 - 当
x-match
为 all 的时候, 就需要消息头的所有值都匹配成功