Сообщение Amazon SQS исчезло - PullRequest
0 голосов
/ 23 мая 2019

У меня есть очередь Amazon SQS и очередь недоставленных сообщений.

Моя программа на 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 установлен флаг reprocess, установленный в true.Если значение равно true, отправьте его обратно в основную очередь.

Теперь я создал сообщение с ошибкой, поэтому каждый раз, когда оно обрабатывается в главной очереди, оно переходит в тупик.И затем я ожидаю, что это будет продолжаться, но SQS, похоже, имеет механизм, чтобы предотвратить это (что хорошо).

Вопрос в том, что это за настройка?

1 Ответ

2 голосов
/ 23 мая 2019

Обычный способ работы очереди Amazon SQS:

  • Сообщения отправляются в очередь
  • Приложение вызывает ReceiveMessage() в очередина получите сообщение (или несколько сообщений).Это увеличивает количество сообщений в сообщении.
  • Это переводит сообщение (я) в состояние невидимое .Это означает, что сообщение все еще находится в очереди, но оно не отображается, если другое приложение пытается получить сообщения из очереди
  • Как только приложение завершило обработку сообщения, оно вызывает DeleteMessage(), предоставляя дескриптор сообщения сообщения.Это удаляет сообщение из очереди.
  • Однако, если приложение не удаляет сообщение в течение периода ожидания невидимости , тогдасообщение снова появляется в очереди .Это делается в случае сбоя приложения.Вместо потери сообщения оно помещается обратно в очередь, чтобы другое (или то же самое) приложение могло обработать его снова.
  • Если сообщение превышает период ожидания невидимости И его Количество сообщений теперь превышает Maximum Receives , теперь не помещено в очередь.Вместо этого он помещается в очередь недоставленных сообщений (DLQ) .

Итак, обычный процесс состоит в том, что Amazon SQS перемещает сообщения в DLQ послесообщение было получено более чем (в вашем случае) 10 попыток получения. Это не ваша задача - переместить сообщение в очередь недоставленных сообщений!

Если вы хотите обрабатывать всю обработку «мертвых писем» самостоятельно (например, переходить в разные очереди)затем отключите функцию DLQ в самой очереди.Вероятно, это приводит к тому, что ваши сообщения исчезают или переходят в неправильное место.

Кстати, при удалении сообщения вам нужно указать MessageHandle сообщения, а не само сообщение.

...