Amazon web services SQS消息在脚本运行后不会被删除

Amazon web services SQS消息在脚本运行后不会被删除,amazon-web-services,amazon-elastic-beanstalk,amazon-sqs,Amazon Web Services,Amazon Elastic Beanstalk,Amazon Sqs,我遇到的问题是,我的SQS消息从未从SQS队列中删除。只有在生命周期结束(即4天)时,才会将其移除 因此,总结一下应用程序: 将URL发送到SQS队列以等待爬网 向Elastic Beanstalk应用程序发送消息,该应用程序将抓取数据并将其存储在数据库中 脚本的工作方式似乎是接收消息,并成功地对消息进行爬网并将数据成功地存储在数据库中。唯一的问题是消息仍然留在队列中,停留在“消息可用”位置 例如,如果我用800条消息加载队列。它将在4天内停留在约800条消息上,然后由于生存期价值,它们将立

我遇到的问题是,我的SQS消息从未从SQS队列中删除。只有在生命周期结束(即4天)时,才会将其移除

因此,总结一下应用程序:

  • 将URL发送到SQS队列以等待爬网

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

脚本的工作方式似乎是接收消息,并成功地对消息进行爬网并将数据成功地存储在数据库中。唯一的问题是消息仍然留在队列中,停留在“消息可用”位置

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

因此,问题:

  • SQS是否应该在脚本发送和接收消息后立即删除该消息

  • 是否有手动方式让我在脚本本身中删除当前消息?据我所知,这条消息只是单向发送。从SQS->App。所以据我所知,我不能做SQS应用程序


有什么想法吗?

没有。当您阅读队列项目时,消息不会被删除;它只在一段特定的时间内隐藏,这段时间称为
可见性超时。可见性超时背后的思想是确保如果一个队列有多个使用者,则没有两个使用者选择相同的项目并开始处理

这是您需要对应用程序进行的更改,以获得预期的行为

  • 将URL发送到SQS队列以等待爬网
  • 向Elastic Beanstalk应用程序发送消息,该应用程序将抓取数据并将其存储在数据库中
  • 在成功爬网状态的事件中,使用接收句柄(而不是消息id)并从队列中删除队列项目。
  • AWS文件-

    worker环境层中的web应用程序只应侦听 本地主机当web应用程序在辅助环境中运行时 层返回200 OK响应,以确认其已接收并 成功处理请求后,守护进程将发送DeleteMessage 调用SQS队列,以便将消息从队列中删除 队列。(SQS自动删除队列中的消息 超过配置的保留期。)如果应用程序 返回除200 OK以外的任何响应,或者在 配置的InactivityTimeout期间,SQS再次使 消息在队列中可见,并可用于另一次尝试 处理


    所以我想这回答了我的问题。有些消息不返回HTTP 200,然后它们被卡在无限循环中。

    但我有另一个SQS应用程序,它与我在这里提到的应用程序非常相似,在发送消息后,所有SQS的消息都被删除,而不是存储。我不会像你在这里建议的那样手动删除任何消息。如果邮件被删除,是否还有其他影响因素?可能是HTTP状态码或其他什么?我也不能100%确定使用Queue-item-ID是什么意思。来自SQS的消息以明文形式通过POST发送到我的Elastic Beanstalk Worker Tier应用程序。它不是消息对象。发送的只是一个字符串。