RabbitMQ—;为什么错误的订阅者会收到已发布的消息?
我有两项服务,经理和催收员RabbitMQ—;为什么错误的订阅者会收到已发布的消息?,rabbitmq,message-queue,amqp,Rabbitmq,Message Queue,Amqp,我有两项服务,经理和催收员 Manager使用routingKeyUSER.COLLECTED订阅队列COLLECTED\u USER,并调用UserCollected处理程序 Collector使用routingKeyUSER.COLLECT订阅队列COLLECT\u USER,并调用CollectUser处理程序 可以有多个收集器,因此我将独占设置为假(代码见下文) 还有其他一些服务可以监听事件,如 user.created user.updated user.deleted 此外,还有
USER.COLLECTED
订阅队列COLLECTED\u USER
,并调用UserCollected
处理程序USER.COLLECT
订阅队列COLLECT\u USER
,并调用CollectUser
处理程序独占
设置为假
(代码见下文)
还有其他一些服务可以监听事件,如
user.created
user.updated
user.deleted
#.已创建
user.#
主题
交换
安装程序
应该发生什么:
用户发布消息。收集
用户。collect
消息并调用CollectUser
处理程序收集器用户
处理程序工作,然后使用routingKey用户发布消息。已收集
user.collected
消息并调用UserCollected
处理程序用户发布消息。收集
(正确)用户。collect
消息并调用CollectUser
处理程序(正确)user.collect
消息,并使用错误的数据调用UserCollected
处理程序。(错)收集器用户
处理程序工作,然后使用routingKey用户发布消息。已收集
(正确)user.collected
消息并调用UserCollected
处理程序(正确)用户。收集
消息,前提是:
收集的用户
队列,而不是收集的用户
队列,并且COLLECT\u用户
队列的收集器已处理该消息url
和参数url
,交换
,类型
,路由键
,队列名
和处理程序
const connection = await amqp.connect(url)
const channel = await connection.createChannel()
channel.assertExchange(exchange, type, { durable: true })
const result = await channel.assertQueue(queueName, { exclusive: false })
channel.bindQueue(result.queue, exchange, routingKey)
channel.prefetch(1)
channel.consume(result.queue, handler)
创建发布者
给定AMQPurl
和参数url
,exchange
,以及type
const connection = await amqp.connect(url)
const channel = await connection.createChannel()
await channel.assertExchange(exchange, type, { durable: true })
出版
给定频道
和参数交换
,路由键
,以及消息
await channel.publish(exchange, routingKey, message)
注
这个问题是我的后续问题。我终于找到了我的问题所在。肮脏的交易。在进行此实验时,我无意中添加了一个将消息路由到错误队列的exchange,这导致了我的困惑
为了解决这个问题,我启动了RabbitMQ管理GUI并删除了所有队列,让我的代码创建它所需要的队列。如上所述的代码没有问题。这应该如您所述。在这一点上,共享一套完整的工作代码来重现这个问题是获得帮助的最佳方式。
rabbitmqctl列表\的输出交换名称类型内部参数策略
和rabbitmqctl列表\绑定源\名称源\种类目的地\名称目的地\种类路由\键参数
也会有所帮助。
await channel.publish(exchange, routingKey, message)