首页 > 解决方案 > 长时间运行的 Beanstalk 工作者作业和部署

问题描述

我在 Beanstalk Worker Tier 上运行长期工作。我已将 VisibilityTimeout、InactivityTimeout 和 nginx 超时设置为 10 小时 - 这按预期工作。ErrorVisibilityTimeout 设置为 30 秒,因为我希望在处理失败时立即重新传递消息。

但是,在部署时,或者如果实例失败并被 Beanstalk 替换,则不会遵守 ErrorVisibilityTimeout 并且消息在确实被重新处理时会保持飞行 10 小时。

我究竟做错了什么 ?如何在实例删除/失败后 30 秒内重新传递消息?

标签: amazon-elastic-beanstalk

解决方案


可悲的是,如果实例失败,您无法更改消息超时。这是因为ErrorVisibilityTimeout参数特定于 EB。它不是 SQS 的财产。所以 EB worker 的工作方式是 EB 实例上的 SQS 守护进程将从队列中接收消息,然后将其传递给您的应用程序。在应用程序返回 http 代码 200 OK 后,守护程序将从队列中删除该消息。

但是,如果您的应用程序返回无法处理消息,则守护程序会将消息返回到队列中。这是由守护进程使用ChangeMes​​sageVisibility来减少消息的可见性超时,以便它再次快速变得可见,尽管默认可见性超时为 10 小时。

由于实例失败或终止,没有什么可以调用ChangeMessageVisibility来减少可见性超时,并且消息保持默认的 10 小时超时。


推荐阅读