【问题标题】:SQS Messages never gets removed/deleted after script run脚本运行后,SQS 消息永远不会被删除/删除
【发布时间】:2014-06-17 08:24:07
【问题描述】:

我遇到了从未从 SQS 队列中删除我的 SQS 消息的问题。它们仅在生命周期结束时才会被移除,即 4 天。

总结一下这个应用:

  • 发送 URL 到 SQS 队列等待被抓取

  • 向 Elastic Beanstalk 应用程序发送消息,该应用程序抓取数据并将其存储在数据库中

该脚本似乎正在运行,意味着它确实收到了消息,并且确实成功地抓取了消息并将数据成功地存储在数据库中。唯一的问题是消息仍在队列中,停留在“消息可用”。

例如,如果我用 800 条消息加载队列。它将在大约 800 条消息中停留 4 天,然后由于生命周期价值,它们将立即被删除。似乎有几条消息被删除,因为数量略有变化,但绝大多数消息从未从队列中删除。

所以问题:

  • SQS 是否假设在脚本发送和接收消息后立即删除消息?

  • 我是否可以在脚本本身中手动删除当前消息?据我所知,该消息仅发送一种方式。从 SQS -> 应用程序。所以据我所知,我不能做 SQS App。

有什么想法吗?

【问题讨论】:

    标签: amazon-web-services amazon-elastic-beanstalk amazon-sqs


    【解决方案1】:

    工作环境层中的 Web 应用程序应该只监听 本地主机。 当 web 应用在 worker 环境中 tier 返回一个 200 OK 响应以确认它已收到并且 成功处理请求,守护进程发送 DeleteMessage 调用 SQS 队列,以便从 排队。 (SQS 会自动删除已经在队列中的消息 长于配置的 RetentionPeriod。)如果应用程序 返回除 200 OK 以外的任何响应或在其中没有响应 配置的 InactivityTimeout 周期,SQS 再次使 消息在队列中可见并且可用于另一次尝试 处理。

    http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features-managing-env-tiers.html

    所以我想这回答了我的问题。有些消息没有返回 HTTP 200,然后就陷入了无限循环。

    【讨论】:

      【解决方案2】:

      不,当您阅读队列项目时,消息不会被删除;它只隐藏一段时间,称为Visibility Timeout。可见性超时背后的想法是确保如果单个队列有多个消费者,则不会有两个消费者选择同一个项目并开始处理。

      这是您对应用进行更改以获得预期行为所需的更改

      1. 发送 URL 到 SQS 队列等待被抓取
      2. 向 Elastic Beanstalk 应用程序发送消息,该应用程序抓取数据并将其存储在数据库中
      3. 在成功抓取状态的情况下,使用receipt-handle(不是消息ID)并从队列中删除队列项。

      AWS 文档 - DeleteMessage

      【讨论】:

      • 但是我有另一个 SQS 应用程序,它与我在这里提到的应用程序非常相似,其中所有 SQS 的消息在发送后都被删除而不是存储。我不会按照您在此处建议的方式手动删除任何消息。如果消息被删除,还有其他影响吗?也许是 HTTP 状态代码或其他什么?
      • 我也不是 100% 确定您使用 Queue-item-ID 的意思。来自 SQS 的消息通过 POST 以纯文本形式发送到我的 Elastic Beanstalk Worker Tier 应用程序。它不是消息对象。它只是一个正在发送的字符串。
      猜你喜欢
      • 2017-06-06
      • 2022-10-06
      • 2012-04-28
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 2017-01-20
      相关资源
      最近更新 更多