全部,
我的 Amazon Elastic Beanstalk Worker 与 SQS 结合使用时遇到了一个相当令人不安的问题,SQS 应该提供 cron 作业调度 - 所有这些都使用 PHP 运行。
以下场景 - 我需要在后台定期执行 PHP 脚本,该脚本最终可能会运行几个小时。我看到了这个很好的介绍,它似乎完全涵盖了我的场景(AWS Worker Environments - 请参阅定期任务部分)
因此,我阅读了大量的操作指南,并使用 SQS 设置了 EBS Worker(这实际上是在创建 Worker 期间自动完成的),并在我的部署包中提供了 cron 配置 (cron.yaml)。
cron 脚本被正确识别。 sqs 守护进程启动,消息被放入队列并完全按计划触发我的 PHP 脚本。脚本已运行,一切正常。
队列的配置如下所示: SQS configuration
但是经过一段时间的处理(脚本仍然很忙 - 并且它不是下一个计划运行^^),第二条消息被打开,同一脚本的另一个实例被执行,另一个,另一个.. . 正好 5 分钟间隔。
我怀疑,不知何故,消息没有从队列中删除(尽管我确保脚本发送回状态 200),如果脚本运行时间太长,最终会创建新消息。
有没有办法防止产生其他消息?告诉队列或 sqs 守护进程不要创建新的飞行消息?我是否必须删除代码中的消息?尽管教程指出它应该自动发生
我只想触发脚本,从队列中删除消息并让脚本运行。请不要使用花哨的后备/重试机制:-)
我花了很多时间试图在互联网上找到一些东西。不成功。如有任何帮助,我们将不胜感激。
谢谢
最佳答案
a second message is opened and another instance of the same script is executed, and another, and another... in exactly 5 minutes intervals.
我怀疑这是第二条消息。我相信这是相同的消息。
如果您在不活动超时到期之前未响应 200 OK,则该消息将返回到队列,是的,您将再次收到它,因为系统假定您已经崩溃,并且您希望再看一遍。这是设计的一部分。
您收到的 X-Aws-Sqsd-Receive-Count
请求 header 会告诉您当前消息已传送的大约次数。 X-Aws-Sqsd-Msgid
请求 header 标识唯一消息。
如果您无法确保脚本在超时之前完成,那么这可能不是该服务的合适用例。听起来该服务运行正常。
关于php - Amazon Elastic Beanstalk Worker cronjob (SQS) 多次触发同一消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42242409/