使用弹性 beantalk 和 SQS 处理失败的 cron 作业
Posted
技术标签:
【中文标题】使用弹性 beantalk 和 SQS 处理失败的 cron 作业【英文标题】:Failed cron job handling with elastic beanstalk and SQS 【发布时间】:2018-03-16 07:23:35 【问题描述】:我有两个弹性豆茎环境。
一个是“主要”网络服务器环境,另一个是处理 cron 作业的工作环境。
我有 12 个 cron 作业,通过一个 cron.yaml 文件设置,这些文件都指向主 Web 服务器上的 API 端点。
以前我的 cron 作业都在 Web 服务器环境中运行,但是当扩大规模时,这当然会创建重复的 cron 作业。
我的新实现运行良好,但我的 cron 作业无法按预期运行,cron 作业会重复,通常在一分钟左右。
我宁愿避免这种行为,只是尝试在下一个预定时间间隔再次运行 cron 作业。
有没有办法配置工作环境/SQS,使失败的作业不会重复?
【问题讨论】:
【参考方案1】:只需配置一个 CloudWatch 事件来接管您的 cron,并让它创建一条 SQS 消息(直接或通过 Lambda 函数)。
您的工作人员现在只需处理 SQS 工作,如果需要,您还可以扩展工作人员。
http://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html
【讨论】:
【参考方案2】:可以,您可以将 Elastic Beanstalk 环境中的Max retries
参数和SQS 队列中的Maximum Receives
参数设置为1
。这样可以保证消息执行一次,如果失败,就会被发送到死信队列。
使用这种方法,如果有任何失败的作业,您的实例可能会变黄,因为消息最终会出现在死信队列中,您可以简单地观察和忽略它,但如果您对需要有强迫症,这可能会很烦人所有环境都是绿色的。您可以将死信队列的Message Retention Period
参数设置为较短的值,以便它尽快消失。
如果您有兴趣,另一种方法是在您的代码中返回状态 200 OK,而不管作业如何运行。这将确保 SQS 守护进程删除队列中的消息,使其不会再次被拾取。
当然,缺点是你必须修改你的代码,但我知道如果你不关心结果,这会有什么意义。
这是一个link to AWS documentation,它解释了所有参数。
【讨论】:
以上是关于使用弹性 beantalk 和 SQS 处理失败的 cron 作业的主要内容,如果未能解决你的问题,请参考以下文章
“npm install”在弹性 beantalk 上失败,但是手动执行有效
如何修复弹性beantalk实例上的“使用这些代码失败的健康检查:”?
botocore.exceptions.ProfileNotFound 当代码在AWS弹性beantalk上运行时,但在本地没问题