AWS SQS, обрабатывающий сообщения в полете - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть программа для чтения файлов, которая сбрасывает каждую строку CSV в SQS;. Лямбда-функция .Net подписывается на получение каждой строки и индивидуальную ее обработку.

Когда элемент завершил обработку (около 1-3 секунд), он удаляется из очереди.

Один разпри обработке строки он отправляет пакет данных в другую область системы, но в журналах я вижу, что мы получаем дублированные пакеты данных из функции.

Из-за запуска лямбда-функцииодновременно;Моя теория работы состоит в том, что элементы очереди все еще находятся в полете, когда функция становится доступной для использования другого элемента - и поэтому она потребляет элемент, который уже обрабатывается.

Поскольку операция удаления выполняется в последний раз, мое решение состоит в том, чтобы переместить операцию удаления в начало функции.

Однако я беспокоюсь о том, разумно ли это, как будто функция зависает или истекает время ожидания при обработке, и мы собираемся полностью потерять пакет.Также, если я удалю элемент из очереди;Сможет ли функция продолжить работу после анализа данных из сообщения?

Итак, мой вопрос состоит из 2 частей

  1. Возможно ли, чтобы лямбда-функция, подписанная на SQS, получила сообщение в полете, в то время как другой экземпляр этой же функции уже обрабатывает его?
  2. Есть ли у меня потенциальные проблемы с удалением элемента очереди, как только функция его подняла

1 Ответ

0 голосов
/ 04 декабря 2018

Старайтесь избегать такого решения.Ваша функция может выдать исключение или может быть уничтожена из-за ограничения 5 минут на лямбды, и вы потеряете ваше сообщение

Вместо этого я постараюсь настроить время ожидания видимости в соответствии с тем, сколько времени требуется вашей функции для обработки сообщения (или сообщения).С другой стороны, вы можете уменьшить количество сообщений, которые ваш слушатель читает каждый раз (по умолчанию 10).Таким образом, это уменьшит общее время обработки, а время обработки будет меньше, чем visibilityTimeout (или время ожидания по умолчанию). Если вы не можете предсказать, сколько времени вам нужно для обработки сообщения, вы можете настроить (расширить) visibilityTimeout ПОСЛЕ того, как вы получили сообщение.

https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html

...