这篇笔记主要用来介绍 RabbitMQ 常见的几种工作模式。
五种工作模式
简单模式
最简单的工作队列,其中一个消息生产者,一个消息消费者,一个队列。也称为点对点模式
一个生产者 P 发送消息到队列 Q,一个消费者 C 进行接收。
工作模式
一个消息生产者,一个交换器,一个消息队列,多个消费者。同样也称为点对点模式
生产者 P 发送消息到队列,多个消费者 C 消费队列的数据。
工作队列也称为公平性队列模式,循环分发,RabbitMQ 将按顺序将每条消息发送给下一个消费者,每个消费者将获得相同数量的消息。
发布订阅模式
一个消息生产者,一个交换机(交换机类型为fanout),多个消息队列,多个消费者。称为发布/订阅模式
在应用中,只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。
生产者 P 只需把消息发送到交换机X,绑定这个交换机的队列都会获得一份一样的数据。
路由模式
在发布/订阅模式的基础上,有选择的接收消息,也就是通过 routing 路由进行匹配条件是否满足接收消息。
在路由模式下,会把消息路由到哪些 binding key 与 routing key 完全匹配的 Queue。
生产者P发送数据是要指定交换机(X)和routing发送消息 ,指定的routingKey=error,则队列Q1和队列Q2都会有一份数据,如果指定routingKey=into,或=warning,交换机(X)只会把消息发到Q2队列。
主题模式
主题模式和路由模式类似,只不过路由模式是指定固定的路由键 routingKey,而主题模式是可以模糊匹配路由键 routingKey,类似于SQL中 = 和 like 的关系。
死信队列
DLX 全称是 Dead-Letter-Exchange,死信交换机。
当一个队列中的消息变成死信之后,会被重新发送到另一个交换机,这个交换机就是 DLX,而绑定 DLX 的队列就是死信队列。
什么情况下会变成死信呢?
- 消息被拒绝
- 消息过期
- 队列达到最大长度
延时队列就是当消息发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后消费者才能拿到消息来消费。
延时功能可以通过设置过期时间(TTL)+死信队列(DLX)来实现。
当已经存在一个队列了,此时再次声明相同名称的队列时,如果属性不一致,就会出现错误。
inequivalent arg ‘x-message-ttl’ for queue
解决办法就是,删除掉已经存在的队列。
因为 RabbitMQ 有多种工作方式,在不同工作模式下,消息投递到队列的方式是不一样的。
- 简单模式:不需要交换机,直接投递到队列
- 路由模式:需要交换机、需要 Routing Key,通过将 Routing 与 Queue 进行绑定,消息才能通过交换机到正确的路由上