使用弹性beanstalk和SQS处理cron作业失败

时间:2017-10-04 19:24:59

标签: amazon-web-services cron elastic-beanstalk amazon-sqs

我有两个弹性的beanstalk环境。

一个是主要的' Web服务器环境,另一个是处理cron作业的工作环境。

我有12个cron作业,通过cron.yaml文件进行设置,该文件都指向主Web服务器上的API端点。

以前我的cron作业都在Web服务器环境中运行,但当然这会在扩展时创建重复的cron作业。

我的新实现工作得很好但是我的cron作业无法按预期运行,cron作业重复,通常在一分钟左右。

我宁愿避免这种行为,只是尝试在下一个预定的时间间隔再次运行cron作业。

有没有办法配置工作环境/ SQS,以便失败的作业不会重复?

2 个答案:

答案 0 :(得分:0)

只需配置一个CloudWatch事件来接管您的cron,并让它创建一条SQS消息(直接或通过Lambda函数)。

您的工人现在只需要处理SQS工作,如果需要,您也可以扩展工人。

http://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html

答案 1 :(得分:0)

是的,您可以将Elastic Beanstalk环境中的Max retries参数和SQS队列中的Maximum Receives参数设置为1。这将确保消息执行一次,如果失败,它将被发送到死信队列。

使用这种方法,如果有任何失败的作业,你的实例可能会变黄,因为这些消息最终会出现在死信队列中,你可以简单地观察和忽略它,但如果你是关于需要的强迫症,这可能会很烦人所有环境都是绿色的。您可以将死信队列的Message Retention Period参数设置为较短的值,以便它尽快消失。

如果您感兴趣,另一种方法是在代码中返回状态200 OK,无论作业如何运行。这将确保SQS守护程序删除队列中的消息,以便它不会再次被拾取。

当然,缺点是您必须修改您的代码,但如果您不关心结果,我可以看到这是有意义的。

这是一个解释所有参数的link to AWS documentation