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

时间:2016-12-23 11:04:00

标签: python celery

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

芹菜documentation说:

  

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

     

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

同时它也说:

  

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

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

4 个答案:

答案 0 :(得分:8)

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

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

来自芹菜文档:

  

请注意,Celery将在工作人员关闭时重新发送消息,因此具有   长时间的可见性超时只会延迟“丢失”的重新传递   电源故障或强行终止时的任务   工人。

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

SQS将这些任务称为" Inflight Messages"。来自http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html

  

在收到消息后,该消息被视为正在进行中   由消费者排队,但尚未从队列中删除。

     

对于标准队列,最多可以有120,000个机上   每个队列的消息。如果达到此限制,Amazon SQS将返回此限制   OverLimit错误消息。为了避免达到极限,你应该   在重新处理后从队列中删除邮件。你也可以   增加用于处理邮件的队列数量。

     

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

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

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

答案 1 :(得分:0)

Celery以异步任务计划程序而闻名。任务的数量真的无关紧要。如果将任务发送到队列,芹菜将执行任务,直到代码中出现错误。在将任务发送到队列之前,您必须检查或限制重复的任务。

答案 2 :(得分:0)

在SQS中,您可以在消息中更改可见性时间。已记录在here中。因此,您需要做的是,在处理消息时,您可以定期更新可见性超时,一旦完成,您就可以删除消息。

要定期延长可见性超时,如果您使用某个循环,则可以根据完成一次迭代的时间,在每次迭代的末尾或每x迭代次数中继续扩展超时。这是执行我的意思的示例代码。

process_message(){
  for(i=0;i++;..){
    .
    .
    .
    if(i%5 == 0){
     extendVisibilityTimeOut(..)
    }
  }
}

答案 3 :(得分:0)

但是here sqs表示收到邮件时可见性超时开始 由消费者使用,因此即使可见性超时为1小时,并且您使用的是12个月的eta值,可见性超时也将在消费者收到消息后开始。 我在这里想念东西吗?