我有一个Amazon队列和一个死信队列。
我的python程序从SQS队列中获取一条消息,然后,如果它引发异常,它将将消息发送到死信队列。
现在,我有了一个程序,可以检查死信队列,如果这些消息仍然可以被处理。如果是,它将被发送回主SQS队列。你看,我在这里期望的是在我的测试中有一个无限的循环,但是很明显,消息在2次尝试后消失了。为什么是这样?
当我在消息中添加一个额外的字段(这是随机值)时,它以某种方式实现了我所期望的(来回发送的无限循环)。在SQS中是否有一种机制可以阻止我在消息相同时所做的事情?
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似乎有一种机制来阻止这种情况的发生(这很好)。
问题是那是什么背景?
发布于 2019-05-23 10:36:12
Amazon队列的正常工作方式是:
ReceiveMessage()以接收消息(或多条消息)。这将增加消息的接收计数。DeleteMessage(),提供消息的消息句柄。此从队列中删除消息。因此,正常的过程是,Amazon在收到消息超过(在您的示例中) 10次尝试接收消息之后,将消息移动到DLQ。将消息移动到死信队列不是您的应用程序的工作!
如果您想自己处理所有的“死信”(例如移动到不同的队列),那么将关闭队列本身上的DLQ功能。这可能会导致您的邮件消失或转到错误的位置。
顺便说一下,在删除消息时,您需要提供消息的MessageHandle,而不是消息本身。
https://stackoverflow.com/questions/56271271
复制相似问题