RabbitMQ 中长时间未确认的消息
Long time unacknowledged message in RabbitMQ
我有一个从 RabbitMQ 队列接收订单的业务流程。我正在考虑不确认它(意思是,将其留在队列中)可能很长时间(> 10 分钟),然后才将其删除(确认)或不删除(不确认)。这有意义吗?在 RabbitMQ 任务之上处理长 运行 处理的最佳方法是什么?
一般来说,这样做是可以的。我已经这样做了很多次,它有一些优点,例如如果您的进程崩溃,未确认的消息将返回队列并稍后再次被拾取
不过这也有一些潜在的缺点。
一方面,未确认的消息可能会使您的服务器超载。请务必设置 consumer prefetch limit 以防止这种情况发生
也可能存在一旦 运行 不应重新启动的进程。我有很多这样的进程......启动外部服务器进程的东西,比如 Oracle 的 long-运行 数据库。在这种情况下,最好立即确认消息并使用某种状态更新队列来了解进程何时完成。
总的来说,没有 "best way" 来处理长 运行 任务...根本没有最佳实践。我们使用的每一种做法都有潜在的好处和潜在的损害。真正的诀窍是了解哪些场景最适合哪种做法。您需要针对您的情况评估这种方法的优缺点。
我有一个从 RabbitMQ 队列接收订单的业务流程。我正在考虑不确认它(意思是,将其留在队列中)可能很长时间(> 10 分钟),然后才将其删除(确认)或不删除(不确认)。这有意义吗?在 RabbitMQ 任务之上处理长 运行 处理的最佳方法是什么?
一般来说,这样做是可以的。我已经这样做了很多次,它有一些优点,例如如果您的进程崩溃,未确认的消息将返回队列并稍后再次被拾取
不过这也有一些潜在的缺点。
一方面,未确认的消息可能会使您的服务器超载。请务必设置 consumer prefetch limit 以防止这种情况发生
也可能存在一旦 运行 不应重新启动的进程。我有很多这样的进程......启动外部服务器进程的东西,比如 Oracle 的 long-运行 数据库。在这种情况下,最好立即确认消息并使用某种状态更新队列来了解进程何时完成。
总的来说,没有 "best way" 来处理长 运行 任务...根本没有最佳实践。我们使用的每一种做法都有潜在的好处和潜在的损害。真正的诀窍是了解哪些场景最适合哪种做法。您需要针对您的情况评估这种方法的优缺点。