我的系统也遇到了同样的问题,你也看到了,在很长时间的任务中连接中断。在
如果您的网络设置使得空闲的TCP/IP连接被强制断开,心跳信号可能会帮助您保持连接的活动状态。如果不是这样的话,改变心跳也无济于事。在
更改连接超时一点帮助也没有。此设置仅在最初创建连接时使用。在I am using a RabbitMQ producer to send long running tasks (30 mins+) to a consumer. The problem is that the consumer is still working on a task when the connection to the server is closed and the unacknowledged task is requeued.
这有两个原因,这两个原因你都已经遇到过了:即使在最好的情况下,连接也会随机下降
由于重新排队的消息而重新启动进程可能会导致问题
在部署了RabbitMQ代码,任务范围从不到1秒到几个小时不等,我发现立即确认消息并用状态消息更新系统对于非常长的任务最有效,比如这样。在
你需要有一个记录系统(可能有一个数据库)来跟踪给定作业的状态。在
当消费者接收到消息并开始处理时,应立即确认该消息,并向记录系统发送“已启动”状态消息。在
当过程完成时,发送另一条消息说它已经完成。在
这不能解决掉连接的问题,但无论如何也不能百分之百地解决这个问题。相反,它将防止在断开连接时发生消息重新排队问题。在
不过,这个解决方案确实引入了另一个问题:当长时间运行的进程崩溃时,如何恢复工作?在
基本的答案是使用作业的记录系统(数据库)状态来告诉您需要重新开始工作。当应用程序启动时,检查数据库以查看是否有未完成的工作。如果有,以适当的方式恢复或重新开始工作。在