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