【问题标题】:Long time unacknowledged message in RabbitMQRabbitMQ 中长时间未确认的消息
【发布时间】:2023-05-08 06:29:01
【问题描述】:

我有一个从 RabbitMQ 队列接收订单的业务流程。我正在考虑不确认它(意思是,将它留在队列中)可能很长时间(> 10分钟),然后才删除它(确认)或不删除它(不确认)。这有意义吗?在 RabbitMQ 任务之上处理长时间运行的处理的最佳方法是什么?

【问题讨论】:

    标签: rabbitmq rabbitmq-exchange


    【解决方案1】:

    一般来说这是可以的。我已经这样做了很多次,它有一些优点,例如如果您的进程崩溃,未确认的消息将返回队列并稍后再次被拾取

    不过,这也有一些潜在的缺点。

    一方面,未确认的消息可能会使您的服务器超载。请务必设置consumer prefetch limit 以防止这种情况发生

    也可能有进程在运行后不应重新启动。我有很多这样的进程......启动外部服务器进程的东西,比如使用 Oracle 的长期运行的数据库数据库。在这种情况下,最好立即确认消息并使用某种状态更新队列来了解该过程何时完成。

    总的来说,没有“最佳方式”来处理长时间运行的任务……根本没有最佳实践。我们使用的每一种做法都有潜在的好处和潜在的危害。真正的诀窍是了解哪些场景最适合哪种做法。您需要针对您的场景评估这种方法的优缺点。

    【讨论】:

    • 谢谢!顺便说一句,你推荐的关于 RabbitMQ 的书是什么?
    • 每个人都应该拥有“RabbitMQ In Action”——一本好书。我也写了几本简短的电子书 leanpub.com/rabbitmq-structures-and-layoutleanpub.com/rmq-patterns 。如果您想真正深入了解消息传递模式和实践,请选择“企业集成模式”。
    • 但我似乎无法将消息返回到队列,它自动被 BasicAcked,即使 noAck ser 为 true。我该怎么做?
    • no ack 必须设置为 false。这个变量的语言是落后的。不过,请务必阅读您使用的任何库的文档,以确保获得正确的设置。一些库重命名它以使其更有意义。
    最近更新 更多