php - Amazon Elastic Beanstalk Worker cronjob (SQS) 多次触发同一消息

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

全部,

我的 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/

相关文章:

ios - 如果字符限制超过 80 个字符,则不会发送推送通知

linux - 如何启动 cron 作业删除偏移量?

php - 如何每 x 小时调用一个链接/href?

php - 适合论坛的 MVC 结构

php - 带有 PHP 和 SQLite 的数据库应用程序在数据库中返回空值

php - 如何在将无限文本流写入文件之前对其进行预处理?

reactjs - 使用 AWS 放大通过网站登录到 chrome 扩展

hadoop - 有没有一种方法可以在AWS Virtual Private Cloud上启动EMR作业。

php - 无法通过 cron [laravel 5.2] 运行 artisan 命令

php - 如何清除Laravel中的缓存?