【发布时间】:2015-09-23 01:20:41
【问题描述】:
我们正在使用 Beanstalk 上的工作层来发送 webhook。我们需要使用指数退避,以防在联系第三方时出现任何错误。但是,我不清楚这将如何工作。
如果作业失败并且我调用ChangeMessageVisibility 来增加时间退避时间,我有两个选择:
- 返回成功 200。然后 SQS 会将其从队列中移除 - 不好。
- 返回错误代码。那么 SQS 会将消息可见性覆盖为默认值吗?
来自Environment Tiers - AWS Beanstalk:
工作环境层中的 Web 应用程序应该只监听 本地主机。当工作环境中的 web 应用程序 tier 返回一个 200 OK 响应以确认它已收到并且 成功处理请求,守护进程发送 DeleteMessage 调用 SQS 队列,以便从 队列。 (SQS 会自动删除已经在队列中的消息 长于配置的 RetentionPeriod。)如果应用程序 返回 200 OK 以外的任何响应,然后 Elastic Beanstalk 等待 在配置完成后将消息放回队列中 可见性超时时间。如果没有响应,则 Elastic Beanstalk 等待将消息放回队列中 InactivityTimeout 时间段,以便消息可用于另一个 尝试处理。
【问题讨论】:
-
您应该在调用第三方时添加指数回退,而不是通过更改 sqs 消息超时
-
我不能让工人坐 24 小时,因为它在通话中后退。这就是 SQS 的用途。我能想出的唯一解决方案是,如果调用未能成功返回并再次排队相同的作业并增加可见性时间......比它应该的更复杂。
-
为什么要等 24 小时?指数退避设计为秒,而不是小时。
-
不一定。指数回退是过程而不是时间限制。如果您打电话给第三方以获取网络挂钩,那么在 1 分钟、15 分钟、一个小时、几个小时、一天放弃是非常有意义的。即使退避时间只达到 60 秒,也浪费了工人的时间坐在那儿整整一分钟无所事事。
标签: php amazon-web-services amazon-sqs amazon-elastic-beanstalk