【问题标题】:Amazon AWS Worker does not delete messages from SQS queueAmazon AWS Worker 不会从 SQS 队列中删除消息
【发布时间】:2016-04-29 09:18:51
【问题描述】:

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

工作环境中的 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 删除消息。

救命!

谢谢。

【问题讨论】:

  • 你是拉消息还是推送消息给你?
  • 你好数据。它们被守护进程推送给工作人员,我用 $postBody = file_get_contents('php://input'); 接收它们

标签: amazon-web-services amazon-ec2 aws-sdk amazon-sqs


【解决方案1】:

好的,我意识到这与发送或不发送响应代码无关。

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

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

我对这个新的 Worker 样式服务器进行了自定义并制作了它的图像,获取了该自定义 ID 并替换了 worker ID,关闭了 ec2 服务器并删除了我从中获取 ID 的新 worker 应用程序。

一旦我重新启动原始应用程序,现在消息就会被删除。

我希望这对某些人有所帮助!

【讨论】:

  • 是的,伙计们,就这么简单...AWS 将成为我的终结者。谢谢@jonathan,遇到了同样的问题。
  • 哈! 4 年后,它终于帮助了其他一些可怜的灵魂。我花了很长时间才弄清楚
  • 很高兴为您服务!我知道它最终会对某人有所帮助!
猜你喜欢
  • 2020-03-24
  • 2019-12-31
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多