2016-01-22 144 views
2

据我了解,如果我发送200 OK头,我的AWS弹性beanstalk Worker订阅SQS队列应自动删除消息。Amazon AWS Worker不会删除SQS队列中的消息

工作环境中的Web应用程序只应侦听本地主机上的 。当工作环境中的Web应用程序返回 时,确认已收到200 OK响应并成功处理请求 ,守护程序将DeleteMessage调用发送到SQS队列,以便将消息从队列中删除。 (SQS 会自动删除已在队列中的消息,比配置的RetentionPeriod长 。)如果应用程序返回任何 响应而不是200 OK,则Elastic Beanstalk将等待将 消息放回配置的VisibilityTimeout后的队列中 期间。如果没有响应,则Elastic Beanstalk将等待在InactivityTimeout期间之后将消息放回到队列中,以便 该消息可用于另一次处理尝试。

但是我没有这样做。他们正在处理好并将他们正在编码的视频保存到正确的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

你正在拉消息还是你有消息推送给你? – datasage

+0

你好datasage。它们被守护进程推送给工作者,我用$ postBody = file_get_contents('php:// input')接收它们; –

回答

1

OK我已经意识到这与发送或不发送响应代码无关。

代码正在发送,但守护程序实际上清除队列项目没有运行,因为我正在使用磁盘映像作为正常的Elastic beanstalk应用程序(之前我一直在使用它,并假定它们将是相同的 - 他们不是)

为了解决这个问题,我创建了一个新的弹性beanstalk worker应用程序,从配置>实例中取得了标准的自定义AMI ID,并在社区实例中搜索并创建了一个新的ec2实例副本。

我对这个新的Worker风格服务器做了自定义,并制作了它的图像,得到了这个自定义ID并替换了工作人员ID,将EC2服务器剥离并删除了我从中获得ID的新工作应用。

一旦我重新启动原来的应用程序现在消息被删除。

我希望这有助于某人在某个时刻!

相关问题