如何在不编写代码的情况下在亚马逊sqs中实现指数退避

Web*_*ube 10 python amazon-sqs amazon-web-services

我有一个需要第三方的简单任务。当请求到来时,我将其推送到队列中amazon sqs,将其拉入工作线程并调用3rd party. 如果超时,我想实现一个指数退避(在 2 秒内重试,然后是 4 秒,然后是 8 秒,然后...)并进行最大重试。

使用pythonboto -> sqs

我一直在寻找内置参数,以允许我用尽可能少的代码来完成此操作(理想情况下,根本不需要代码)。

就像是

from boto import sqs

def handle_message(message):
    try:
      # send a post to api
    except TimeOut, err:
      # send_back_to_itself in 2/4/8 sec
      if delay < DELAY_LIMIT:
          queue.write(message, delay=secs)
Run Code Online (Sandbox Code Playgroud)

Mat*_*gan -4

根据AWS SDK 文档,如果您使用官方 SDK 库之一,您可以免费获得指数退避。所以看来你需要做的就是设置你的max_attempts计数,第一次尝试之后的所有事情都会呈指数级下降:

import boto3
from botocore.config import Config

config = Config(
    retries = dict(
        max_attempts = 10   # docs say default is 5
    )
)

sqs = boto3.client('sqs', config=config)
sqs.receive_message(QueueUrl='https://sqs.us-east-1.amazonaws.com/<your-account-num>/foobar')
Run Code Online (Sandbox Code Playgroud)

  • OP 要求在重新处理 SQS 消息之前等待指数级增加的时间,而不是指数级等待来自 SQS API 的响应。 (25认同)