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

时间:2014-06-17 08:24:07

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

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

总结一下应用程序:

  • 将网址发送到SQS队列以等待抓取

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

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

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

所以问题:

  • Isnt SQS假设在邮件发送和收到邮件后立即删除邮件?

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

有什么想法吗?

2 个答案:

答案 0 :(得分:9)

  

工作者环境层中的Web应用程序应该只监听   当地主人。 当工作环境中的Web应用程序时   tier返回200 OK响应,以确认它已收到和   成功处理了请求后,守护进程发送了一个DeleteMessage   调用SQS队列,以便从中删除该消息   队列即可。 (SQS会自动删除队列中的消息   比配置的RetentionPeriod更长。)如果是应用程序   返回200以外的任何响应,或者内部没有响应   在配置的InactivityTimeout期间,SQS再次制作了   队列中可见的消息,可用于另一次尝试   处理

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

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

答案 1 :(得分:4)

读取队列项时,不会删除邮件;它仅在特定时间内被隐藏,称为Visibility Timeout。可见性超时背后的想法是确保如果单个队列有多个消费者,则没有两个消费者选择相同的项目并开始处理。

这是您应用程序获取预期行为所需的更改

  1. 将网址发送到SQS队列以等待抓取
  2. 向Elastic Beanstalk App发送消息,抓取数据并将其存储在数据库中
  3. 在成功抓取状态的情况下,使用收据句柄(而不是消息ID)并从队列中删除队列项。
  4. AWS文档 - DeleteMessage

相关问题