据我了解,我的AWS弹性beanstalk订阅SQS队列的工作人员应该在我发送200 OK标题时自动删除邮件。
工作环境中的Web应用程序应该只监听 当地主持人。当工作线程环境中的Web应用程序返回时 一个200 OK响应,以确认它已收到并成功 处理完请求后,守护进程发送一个DeleteMessage调用 SQS队列使得消息将从队列中删除。 (SQS 自动删除队列中的消息更长时间 比配置的RetentionPeriod。)如果应用程序返回任何 200以外的响应OK,然后Elastic Beanstalk等待放入 在配置的VisibilityTimeout之后回发队列中的消息 期。如果没有响应,则Elastic Beanstalk等待放置 在InactivityTimeout时段之后返回队列中的消息 该消息可用于另一次处理尝试。
但我的不是这样做的。他们正在处理OK并将他们正在编码的视频保存到正确的S3存储桶中。但是他们不会像他们应该那样删除队列项目。
我尝试过以各种方式发送标题,包括......
http_response_code(200);
header("HTTP/1.1 200 OK");
header("HTTP/1.1 200 OK", true, 200);
我在页面上没有输出但是尝试调用ob_start();在开始和ob_end_flush();发送标题后,甚至尝试在开始任何处理之前立即执行标题。没有任何作用,消息仍在飞行中,并在其可见性超时结束后重新传送。
我无法想到删除这些消息的任何其他内容 - 工作人员(我认为)只接收消息正文,因此我甚至无法自行处理并通过其处理程序删除消息使用API。
帮助!
感谢。
答案 0 :(得分:1)
好的我已经意识到这与发送或不发送响应代码无关。
正在发送代码,但是实际清除队列项的守护进程没有运行,因为我正在使用磁盘映像作为普通的Elastic beanstalk应用程序(之前我一直在使用它并假设它们是相同的 - 他们不是)
为了解决这个问题,我创建了一个新的弹性beanstalk工作者应用程序,从配置>实例中获取标准的自定义AMI ID,并在社区实例中搜索它并启动新的ec2实例副本。
我对这个新的工作者风格服务器进行了自定义并制作了它的图像,获得了自定义ID并替换了工作者ID,将ec2服务器分离并删除了我从中获取ID的新工作者应用程序。
现在我重新启动原始应用后,邮件会被删除。
我希望这在某些方面对某人有帮助!