首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Amazon消息消失

Amazon消息消失
EN

Stack Overflow用户
提问于 2019-05-23 08:40:00
回答 1查看 6.3K关注 0票数 0

我有一个Amazon队列和一个死信队列。

我的python程序从SQS队列中获取一条消息,然后,如果它引发异常,它将将消息发送到死信队列。

现在,我有了一个程序,可以检查死信队列,如果这些消息仍然可以被处理。如果是,它将被发送回主SQS队列。你看,我在这里期望的是在我的测试中有一个无限的循环,但是很明显,消息在2次尝试后消失了。为什么是这样?

当我在消息中添加一个额外的字段(这是随机值)时,它以某种方式实现了我所期望的(来回发送的无限循环)。在SQS中是否有一种机制可以阻止我在消息相同时所做的事情?

代码语言:javascript
复制
def handle_retrieved_messages(self):
    if not self._messages:
        return None

    for message in self._messages:
        try:
            logger.info(
                "Processing Dead Letter message: {}".format(
                    message.get("Body")
                )
            )
            message_body = self._convert_json_to_dict(message.get("Body"))
            reprocessed = self._process_message(
                message_body, None, message_body
            )
        except Exception as e:
            logger.exception(
                "Failed to process the following SQS message:\n"
                "Message Body: {}\n"
                "Error: {}".format(message.get("Body", "<empty body>"), e)
            )
            # Send to error queue
            self._delete_message(message)
            self._sqs_sender.send_message(message_body)
        else:
            self._delete_message(message)
            if not reprocessed:
                # Send to error queue
                self._sqs_sender.send_message(message_body)

self._process_message将检查message_body是否将重新处理标志设置为true。如果为真,则将其发送回主队列。

现在,我错误地制作了消息的内容,所以每次在主队列中处理它,它都会变成死信。然后,我希望它继续循环,但是SQS似乎有一种机制来阻止这种情况的发生(这很好)。

问题是那是什么背景?

EN

回答 1

Stack Overflow用户

发布于 2019-05-23 10:36:12

Amazon队列的正常工作方式是:

  • 消息是发送到队列的。
  • 应用程序调用队列中的ReceiveMessage()接收消息(或多条消息)。这将增加消息的接收计数。
  • 这将消息置于不可见的状态。这意味着消息仍在队列中,但如果另一个应用程序试图从队列接收消息,则消息不可见。
  • 一旦应用程序完成了消息的处理,它就调用DeleteMessage(),提供消息的消息句柄。此从队列中删除消息
  • 但是,如果应用程序没有在不可见超时期间内删除消息,则消息再次出现在队列中--。这是在应用程序崩溃时完成的。而不是丢失消息,而是将其放回队列中,以便另一个(或相同的)应用程序能够再次处理它。
  • 如果消息超过不可见超时时间,并且其接收计数现在超过了最大值接收设置,则不会将其放回队列中。相反,它被放置在死信队列(DLQ)上。

因此,正常的过程是,Amazon在收到消息超过(在您的示例中) 10次尝试接收消息之后,将消息移动到DLQ。将消息移动到死信队列不是您的应用程序的工作!

如果您想自己处理所有的“死信”(例如移动到不同的队列),那么将关闭队列本身上的DLQ功能。这可能会导致您的邮件消失或转到错误的位置。

顺便说一下,在删除消息时,您需要提供消息的MessageHandle,而不是消息本身。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56271271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档