芹菜SQS 任务重复 SQS可见性超时



我的大多数芹菜任务的ETA更长,其最大可见度超时由Amazon SQS定义。

芹菜文档说:

这会导致ETA/倒计时/重试任务的问题 执行超过可见度超时;实际上,如果发生这种情况

将再次执行。

因此,您必须增加可见度超时以匹配 您打算使用的最长的ETA。

同时,它还说:

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

,如果我使用SQS,我该怎么办?

,我该怎么做

通常,拥有非常长的eTA的任务不是一个好主意。

首先,存在" visibility_timeout"问题。而且您可能不希望能可见性超时这是另一个月。

来自芹菜文档:

请注意,芹菜将在工人关闭时重新计算消息,因此 长时间的可见度超时只会延迟"丢失"的重新交付 如果发生电力故障或有力终止的任务 工人。

,而且SQS仅允许在列表中进行如此多的任务。

SQS称这些任务为"机上消息"。来自http://docs.aws.amazon.com/awssimplequeueservice/latest/sqsdeveloperguide/sqs-visibility topepemibilitypemible time tere out.html:

一条消息被认为是在接收到的消息后。 消费者队列,但尚未从队列中删除。

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

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

我看到了两种可能的解决方案,您可以改用RabbitMQ,而不是依赖可见度超时(如果您不想管理自己的" RabbitMQ作为服务"服务)或更改代码以使您的代码很小(最佳实践)

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

芹菜对异步任务调度程序已知。这与任务计数确实没有关系。如果将任务发送到队列,芹菜将执行任务,直到代码中存在错误。在将任务发送到队列之前,您必须检查或限制重复任务。

在SQS中,您可以从消息中更改可见性时间。它在这里记录在这里。因此,您要做的就是这样,当您处理消息时,您可以继续定期更新可见性时间,并且完成后,您可以删除消息。

要定期延长可见性时间,如果您使用的是某个循环,则可以在每次迭代结束时延长超时,或者根据完成一项迭代的时间,在每次迭代的末尾或每个迭代次数。这是做我的意思的示例代码。

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

相关内容

  • 没有找到相关文章

最新更新