gpt4 book ai didi

python - 在不引起监控错误的情况下重试队列中的任务

转载 作者:太空宇宙 更新时间:2023-11-04 05:35:09 24 4
gpt4 key购买 nike

我们使用 Google App Engine 和内置的 TaskQueues 通过 Mandrill 发送每日更新电子邮件。它们在特定时间发送,通常有很多。我们为每封要发送的电子邮件安排一个任务,其中一些任务失败是因为 Mandrill API 超时或我们达到了某个速率限制。

我们的代码如下所示:

@app.route('/worker/send_transactional_email/', methods=['POST'])
def worker_send_transactional_mail():

payload = json.loads(request.values.get('payload'))

message = {
'to': [payload.get('to')],
'subject': payload.get('subject'),
'from_name': 'Our App',
'from_email': "noreply@ourapp.local",
'text': payload.get('body_text')
}

mandrill_payload = _get_mandrill_payload(message)

url = "https://mandrillapp.com/api/1.0/messages/send-template.json"
req = urllib2.Request(url, mandrill_payload, {'Content-Type': 'application/json'})
try:
urllib2.urlopen(req)
except urllib2.URLError as error:
logging.info("to: " + unicode(payload.get('to')))
logging.info("subject: " + unicode(payload.get('subject')))
logging.info(error.code)
logging.info(error.read())
abort(500)
return 'ok'

该解决方案非常有效,因为失败的任务稍后会重试,通常会在那时完成。我们面临的唯一问题是失败的任务会出现在错误日志中并导致 Google Cloud Monitoring 报告错误。

我想要的是将上面 except block 中的 abort(500) 替换为告诉 TaskQueue 重试任务但不记录任何内容的内容错误什么的。我知道我可以返回 200-299 以外的任何状态代码,并且 TaskQueue 将重试,但我不确定正确的方法是返回 301 或其他内容,因为它具有很强的误导性。

最佳答案

如果您在队列上配置重试,则无需更改代码,因为 500 响应会让队列逻辑知道触发重试。除非您达到最大重试次数,否则应该不需要手动重新排队,在这种情况下,您应该有一些其他方法来确保您可以明确跟踪任务所需的完成并重新排队,或者通过检查简单地捕获最后一次重试X-Appengine-Taskretrycount header 。如文档中所述,make sure tasks are idempotent .

关于python - 在不引起监控错误的情况下重试队列中的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35886367/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com