使用弹性 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 作业的主要内容,如果未能解决你的问题,请参考以下文章

如何在beantalk worker中批量读取sqs消息

“npm install”在弹性 beantalk 上失败,但是手动执行有效

用户“ebroot”弹性beantalk的密码认证失败

如何修复弹性beantalk实例上的“使用这些代码失败的健康检查:”?

botocore.exceptions.ProfileNotFound 当代码在AWS弹性beantalk上运行时,但在本地没问题

使用 Django 和 Elastic beantalk 实现并行任务的最佳方法是啥?