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 此外,还有

我有两项服务,经理和催收员

  • Manager使用routingKey
    USER.COLLECTED
    订阅队列
    COLLECTED\u USER
    ,并调用
    UserCollected
    处理程序
  • Collector使用routingKey
    USER.COLLECT
    订阅队列
    COLLECT\u USER
    ,并调用
    CollectUser
    处理程序
  • 可以有多个收集器,因此我将
    独占
    设置为
    (代码见下文)

    还有其他一些服务可以监听事件,如

    • user.created
    • user.updated
    • user.deleted
    此外,还有一些服务可以监听更一般的事件,如

    • #.已创建
    • user.#
    等等

    因此,我使用了
    主题
    交换

    安装程序 应该发生什么:
  • 管理器使用routingKey
    用户发布消息。收集
  • Collector获取
    用户。collect
    消息并调用
    CollectUser
    处理程序
  • 收集器的
    收集器用户
    处理程序工作,然后使用routingKey
    用户发布消息。已收集
  • Manager获取
    user.collected
    消息并调用
    UserCollected
    处理程序
  • 实际发生的情况:
  • 管理器使用routingKey
    用户发布消息。收集
    (正确)
  • Collector获取
    用户。collect
    消息并调用
    CollectUser
    处理程序(正确)
  • Manager还获取
    user.collect
    消息,并使用错误的数据调用
    UserCollected
    处理程序。(错)
  • 收集器的
    收集器用户
    处理程序工作,然后使用routingKey
    用户发布消息。已收集
    (正确)
  • Manager获取
    user.collected
    消息并调用
    UserCollected
    处理程序(正确)
  • 我的问题 为什么管理器会收到
    用户。收集
    消息,前提是:

  • 它正在侦听
    收集的用户
    队列,而不是
    收集的用户
    队列,并且
  • 正在侦听
    COLLECT\u用户
    队列的收集器已处理该消息
  • 实施细节 我创建订阅者和发布者如下(根据相关性调整)

    创建订阅服务器 给定AMQP
    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)
    
    创建发布者 给定AMQP
    url
    和参数
    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)