首页 文章

AWS Beanstalk:SQS的指数退避?

提问于
浏览
2

我们正在使用Beanstalk上的工作层发送webhook . 如果在联系第三方时出现任何错误,我们需要使用指数退避 . 但是,我不清楚这是如何工作的 .

如果作业失败并且我调用 ChangeMessageVisibility 来增加退避时间,我有两个选择:

  • 返回成功200.然后SQS将其从队列中删除 - 不好 .

  • 返回错误代码 . 然后SQS会将消息可见性覆盖为默认值?

Environment Tiers - AWS Beanstalk

工作线程环境中的Web应用程序应仅侦听本地主机 . 当工作线程环境层中的Web应用程序返回200 OK响应以确认它已收到并成功处理了请求时,守护程序将向SQS队列发送DeleteMessage调用,以便从队列中删除该消息 . (SQS自动删除队列中的消息的时间超过配置的RetentionPeriod . )如果应用程序返回200 OK以外的任何响应,则Elastic Beanstalk会在配置的VisibilityTimeout期间后等待将消息放回队列中 . 如果没有响应,则Elastic Beanstalk会在InactivityTimeout时段之后等待将消息放回队列中,以便该消息可用于另一次处理尝试 .

1 回答

  • 5

    ChangeMessageVisibility 的限制为12小时,仅适用于机上工作(在工作期间,您希望通知SQS "I need more time to complete this"的工作) .

    唯一的解决方案是在队列中创建具有相同详细信息的新作业和用于重试的附加计数器(在消息中或作为属性),并使用具有基于 retries + 1 的指数退避的DelaySeconds .

    不幸的是 DelaySeconds 有15分钟(900秒)的限制,所以你安排的工作时间比你有几个选择:

    • 每隔15分钟重新安排一次工作,但在重试达到足够高之前不要完成任务 . 这将会运行95个工作,直到第96个工作都没有 . 这可能会产生大量的虚拟工作 .

    • 将作业放在其他地方(如数据库或缓存),使用cron或其他一些预定进程,一旦达到最小时间戳,就将其放回队列中 . 例如,时间戳现在是1天 .

相关问题