首页 文章

RabbitMQ真实场景

提问于
浏览
2

我使用RabbitMQ需要的是: 生产环境 者生成消息,接收者接收所有消息,这些消息在首次连接到队列之后发布 .

由于消费者想要消费所有发布的消息 . 因为,如果多个消费者连接到同一个队列,那么消费者将不会收到所有消息 . (另请参阅here) . 因此,消费者必须创建一个 'exclusive' 队列并连接到所需的交换 . 此外,它希望接收所有已发布的消息,即使它已关闭(将来) . 因此队列是 'durable' . 现在,场景看起来像:

消费者C1创建一个独特且耐用的队列Q1 . 现在它已经停止了一段时间,同时另一个用户C2尝试连接到队列Q1 . C2将成功,因为Q1现在没有订户连接到它 . 因此,C2连接到独占且持久的队列 . 现在,如果C1尝试连接到队列Q1,则它不能这样做,因为消费者C2已经订阅了队列Q1 .

如何防止这种情况?

我希望,这次我很清楚 .

3 回答

  • 0

    唉唉!简单的答案......我不知道这个关于消费者的事情 . 让消费者 exclusive . 现在只有这个消费者可以连接到队列 . 但是,如果创建该消费者的渠道已关闭,则目的将失败 . 因此,如果使用独占队列或消费者,则不得关闭 Channels . 你可以找到更多关于这个here的信息 .

  • 0

    也许消费者C2可以使用相同的路由密钥创建自己的队列,然后接收从那时起发布的新消息 .

    如果C1回来,它可以使用它之前的连接 . 并且两个消费者都收到消息 .

  • 1

    我已经在你昨天发布的类似名称的问题中回答了这个问题,我不确定它在哪里消失了 . 你删除了吗?

    无论如何,答案(再次)是使用 unique naming scheme . 只需确保您的消费者使用某种形式的可预测但唯一的每消费者密钥,该密钥用作他们声明的队列名称 .

    您的应用程序有责任防止消费者C2连接到针对消费者C1的队列 . RabbitMQ不会神奇地防止这种情况发生 .

相关问题