Rabbit MQ 阻止调用以发送消息并确保它为超出消息限制或超出消息大小限制提供正确的回复代码

Posted

技术标签:

【中文标题】Rabbit MQ 阻止调用以发送消息并确保它为超出消息限制或超出消息大小限制提供正确的回复代码【英文标题】:Rabbit MQ blocking call to send the message and ensure it gives the right reply code for messages limit exceeded or message size limit exceeded 【发布时间】:2018-04-22 06:14:31 【问题描述】:

您好,我正在寻找有关 rabbit mq 的简单解决方案。以下是对兔子进行的设置。

    启动兔子服务器 使用持久选项创建主题类型的交换 (myexchange)。 使用持久选项创建队列 (myqueue),并将 x-max-length-bytes 设置为 4,x-max-length 设置为 2。 将 myexchange 与 myrouting 绑定到 myqueue。 使用 basic_publish 使用 aqmp 通道发布消息(channel.basicPublish(myexchange, myrouting, true, null, "test".getBytes("UTF-8")); 使用发布者确认设置,如 channel.confirmSelect();和 channel.waitForConfirmsOrDie();

下面的代码sn-p

channel = connectionFactory.getChannel();
channel.queueDeclarePassive("myqueue");
channel.confirmSelect();
channel.basicPublish("myexchange", "myrouting", true, 
        null, "test".getBytes("UTF-8"));
channel.waitForConfirmsOrDie();

现在,rabbit mq 没有回复超出消息数量/超出大小的错误。我可以发送 1000 条消息/大小为 1kb,并且消费者也可以使用所有这些消息。那么我怎么能得到错误代码呢? 请问这方面有什么帮助吗?

【问题讨论】:

【参考方案1】:

RabbitMQ 团队会监控 this mailing list,并且有时只会在 *** 上回答问题。


您需要在这里考虑两个项目。首先,您的消费者可能会以足够快的速度消费消息,以至于永远无法达到限制。

其次,当达到队列长度限制时,消息会从队列头部丢弃,以便为新消息腾出空间。 这意味着您将丢失队列中最旧的消息 - docs。此行为可在 3.7.0 中配置。

但是,在任何情况下都不会返回错误,所以我不知道您为什么认为会返回错误。文档清楚地说明了达到队列限制时会发生什么。

【讨论】:

谢谢卢克,在这种情况下获得丢弃的消息数量的最佳方法是什么。我是否正确使用消费者 acks/nacks 机制来获取已消费的消息数。 谢谢卢克,在这种情况下获得丢弃的消息数量的最佳方法是什么(如果我不使用死信队列)。我是否正确使用消费者确认机制来查找消息已成功传递到队列。 (假设我正在进行阻塞调用以将消息发送到队列)。 是的,您需要使用publisher confirms 来确定您的消息已发布。使用死信交换是了解丢弃消息数量的唯一方法。如果我的原始答案和此后续内容足够,请将我的回复标记为已接受的答案。 不客气。如果您对我的回复感到满意,能否将其标记为已接受的答案?

以上是关于Rabbit MQ 阻止调用以发送消息并确保它为超出消息限制或超出消息大小限制提供正确的回复代码的主要内容,如果未能解决你的问题,请参考以下文章

Rabbit-MQ常见问题摘要

Rabbit MQ 消息确认 ACK 解析,消息确认详解 Rabbit MQ

rabbit mq 一些用法

rabbit-mq学习1:基本概念和快速入门

rabbit-mq学习1:基本概念和快速入门

Rabbit MQ部署步骤