脚本运行后,SQS消息永远不会被删除/删除

Mar*_*ind 5 amazon-sqs amazon-web-services amazon-elastic-beanstalk

我遇到的问题是我的SQS消息永远不会从SQS队列中删除.只有在生命周期结束时才会删除它们,即4天.

所以总结一下应用程序:

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

  • 向Elastic Beanstalk App发送消息,抓取数据并将其存储在数据库中

该脚本似乎工作的意思是它确实收到了消息,它确实成功抓取它并将数据成功存储在数据库中.唯一的问题是消息保留在队列中,卡在"可用消息"中.

所以,如果我例如用800条消息加载队列.它会在大约800条消息中停留4天,然后由于生命周期的价值,它们将立即被删除.似乎有一些消息被删除,因为数字略有变化,但大部分消息从未从队列中删除.

所以问题:

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

  • 我是否有手动方式在脚本本身删除当前消息?据我所知,消息只发送1路.来自SQS - > App.所以据我所知,我不能做SQS < - > App.

有任何想法吗?

Mar*_*ind 11

工作线程环境中的Web应用程序应仅侦听本地主机.当工作线程环境层中的Web应用程序返回200 OK响应以确认它已收到并成功处理了请求时,守护程序将向SQS队列发送DeleteMessage调用,以便从队列中删除该消息.(SQS自动删除队列中的消息的时间超过配置的RetentionPeriod.)如果应用程序返回200 OK以外的任何响应,或者在配置的InactivityTimeout期间没有响应,则SQS再次使消息在队列中可见并可用于另一次处理.

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

所以我猜这回答了我的问题.某些消息不返回HTTP 200,然后它们陷入无限循环.


Nav*_*jay 5

阅读Queue Item时,不会删除任何消息;它仅在特定时间内隐藏,称为Visibility Timeout。可见性超时背后的想法是,确保单个队列中有多个使用者,而没有两个使用者选择同一项目并开始处理。

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

  1. 将URL发送到SQS队列以等待爬网
  2. 将消息发送到Elastic Beanstalk应用,该应用对数据进行爬网并将其存储在数据库中
  3. 在成功抓取状态的情况下,使用回执句柄(而不是消息ID)并从队列中删除队列项。

AWS文档-DeleteMessage