我有两个弹性的beanstalk环境。
一个是主要的' Web服务器环境,另一个是处理cron作业的工作环境。
我有12个cron作业,通过cron.yaml文件进行设置,该文件都指向主Web服务器上的API端点。
以前我的cron作业都在Web服务器环境中运行,但当然这会在扩展时创建重复的cron作业。
我的新实现工作得很好但是我的cron作业无法按预期运行,cron作业重复,通常在一分钟左右。
我宁愿避免这种行为,只是尝试在下一个预定的时间间隔再次运行cron作业。
有没有办法配置工作环境/ SQS,以便失败的作业不会重复?
答案 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。