15

我在 SQS 队列中有一小部分消息,即使发送到 AWS 端点的删除请求返回 200 响应,这些消息也不会被删除。我的应用程序很好地处理了这些消息,并且也很好地发送了删除请求。

我正在使用 Java AWS SDK 1.3.6。

有没有其他人遇到过这个问题?

4

3 回答 3

15

糟糕 - 队列被意外设置为defaultVisibilityTimeout=0. 将其更改为正值可以解决问题。

不过,这仍然提出了一些问题:

  1. 为什么这只影响某些消息?也许有些需要更长的时间来处理?
  2. 当消息没有被删除时,为什么亚马逊会返回 200 来删除?
  3. 删除失败是因为它落在了 0 秒窗口之外(在这种情况下,为什么任何删除请求都会成功?),还是因为在收到删除请求时另一个消费者已经拿起它们而失败?
于 2012-04-18T10:21:45.843 回答
3

官方文档(1.9.13版)

重要提示:即使您已将其删除,您也可能会收到一条消息。如果在您请求删除邮件时存储邮件副本的服务器之一不可用,这种情况可能会发生。该副本保留在服务器上,并且可能会在后续接收请求时再次返回给您。您应该将系统创建为幂等的,以便多次接收特定消息不是问题。

于 2015-04-01T10:28:02.413 回答
0

如果您传递了您的异常,则很有可能您实际上并没有删除您的 sqs 消息,因此它被卡在“飞行中”,因为您的处理过程中可能存在错误。尝试将您的 sqs 轮询包装起来,除了这样,看看您是否有任何异常:

import traceback
import sys

try:
    pollsqshere()
except Exception:
    print(traceback.format_exc())
    # or
    print(sys.exc_info()[2])
于 2021-10-20T19:27:48.043 回答