我想知道这是否可能。我想从队列中拉出一个任务,并且在将 ack 发送回 RabbitMQ 通知工作已完成之前可能需要 3 秒或更长时间(可能)分钟的任何工作。工作由用户完成,因此这就是处理工作所需时间不同的原因。
我不想在退出队列后立即确认消息,因为如果没有收到确认,我希望将消息重新排队。谁能给我任何关于如何解决我的问题的见解?
我想知道这是否可能。我想从队列中拉出一个任务,并且在将 ack 发送回 RabbitMQ 通知工作已完成之前可能需要 3 秒或更长时间(可能)分钟的任何工作。工作由用户完成,因此这就是处理工作所需时间不同的原因。
我不想在退出队列后立即确认消息,因为如果没有收到确认,我希望将消息重新排队。谁能给我任何关于如何解决我的问题的见解?
长时间超时应该没问题,当然,正如您所说,如果出现问题,您希望重新交付,因此您只想在完成后确认 。
实现这一目标的最佳方式,IMO,将是在队列上有多个消费者(即多个线程/进程从同一个队列消费)。这应该没问题,只要您的队列内容没有特定的排序约束(即,如果队列包含表示涉及 FK 约束的 Postgres 数据的内容,可能会采用这种方式)。
RabbitMQ网站上的本教程提供了更多信息( Python链接,但应该有其他语言的类似教程):https ://www.rabbitmq.com/tutorials/tutorial-two-python.html
编辑以回应OP的评论:
你的心跳设置为多少?如果您的工作人员在设定的时间内没有确认心跳,服务器将认为连接已死。
不确定您使用的是哪种语言,但对于 Java,您将使用该setRequestedHeartbeat
方法来指定心跳。
您实现工作程序的方式,仍然可以将心跳发送回RabbitMQ服务器至关重要。如果有东西阻止客户端发送心跳,服务器将在时间间隔到期后终止连接。