我的大多数芹菜任务的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(..)
}
}
}