Celery SQS +任务复制+ SQS可见性超时

Ale*_*kov 2 python celery

我的大多数Celery任务的ETA都比Amazon SQS定义的最大可见性超时长.

Celery 文档说:

这会导致ETA /倒计时/重试任务出现问题,执行时间超过可见性超时; 事实上,如果发生这种情况,它将再次执行,并再次循环执行.

因此,您必须增加可见性超时以匹配您计划使用的最长ETA的时间.

同时它还说:

截至撰写本文时,AWS支持的最大可见性超时为12小时(43200秒):

如果我使用SQS,我该怎么做才能避免在我的工作人员中多次执行任务?

小智 8

通常,使用非常长的ETA进行任务并不是一个好主意.

首先,存在"visibility_timeout"问题.你可能不希望一个非常大的可见性超时,因为如果工作人员在任务即将运行前1分钟崩溃,那么队列仍将等待visibility_timeout完成,然后将任务发送给另一个工作人员,我想你不想要这将是另一个月.

来自芹菜文档:

请注意,Celery将在工作人员关闭时重新发送消息,因此具有较长的可见性超时将仅在发生电源故障或强制终止工作时延迟"丢失"任务的重新传递.

而且,SQS只允许在列表中执行许多任务.

SQS将这些任务称为"机上信息".来自http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html:

在消费者从队列接收消息但尚未从队列中删除消息之后,该消息被认为是在飞行中.

对于标准队列,每个队列最多可以有120,000个机上消息.如果达到此限制,Amazon SQS将返回OverLimit错误消息.为避免达到限制,您应该在处理完队列后删除它们.您还可以增加用于处理邮件的队列数.

对于FIFO队列,每个队列最多可以有20,000个机上消息.如果达到此限制,Amazon SQS将不会返回任何错误消息.

我看到两种可能的解决方案,您可以使用RabbitMQ,它不依赖于可见性超时(如果您不想管理自己的"RabbitMQ即服务"服务)或更改您的代码以获得非常小的ETA(最佳实践) )

这些是我的2美分,也许@asksol可以提供一些额外的见解.