似乎Celery(v4.1)既可以用于某些预取任务,也可以用于CELERY_ACKS_LATE=True
(讨论here)
我们目前使用CELERY_ACKS_LATE=False
和CELERYD_PREFETCH_MULTIPLIER=1
在这两种情况下,Rabbit中都有未确认的消息
有时我们遇到网络问题导致Celery丢失与Rabbit的连接几秒钟,收到这些警告:consumer: Connection to broker lost. Trying to re-establish the connection...
发生这种情况时,未确认的消息会转回Ready
,这似乎是标准行为,并且正被其他消费者使用。
这会导致多个任务的执行,因为消费者在工作进程中启动了预取任务,但无法将其发送给Rabbit。
由于似乎不可能保证任务在没有外部工具的情况下在Celery中执行一次,如何才能确保任务最多执行一次?
-----编辑----
我考虑的一种方法是使用任务self.request.delivery_info['redelivered']
并执行redelivered
的任务失败。
在实现"最多执行一次"这将具有很高的误报率(已经执行过的任务)
答案 0 :(得分:0)
任务被执行一次之间存在差异,并且当多次执行任务时存在额外的副作用,即。如果你的任务不是幂等的,那么执行两次相同的任务将导致错误。
我建议允许任务执行多次,但要使它们具有幂等性,以便它们在已经执行时无效。