Для такой проблемы вы можете попробовать множество обходных путей из ваших сервисов, таких как проверка на наличие дубликатов message_ids или ведение двух очередей для этой цели. Все это кажется законным, но потребляет дополнительную вычислительную мощность. Хорошим решением было бы использование внутренней функциональности самого AWS SQS. Но, тем не менее, этого может быть недостаточно для удовлетворения наших требований. Ниже приводятся несколько подходов, которые можно использовать для этой цели.
- Стандартная очередь SQS + Lambda + База данных
Это подход, который вы предложили, когда мы проверяем базу данных на предмет обработанных message_ids и стараемся не обрабатывать одно и то же сообщение дважды. Убедитесь, что вы добавили индекс для столбца message_id для более быстрой проверки.
- Издатель сообщений + Стандартная очередь SQS + Лямбда + База данных
Здесь вы можете попросить издателя сообщений убедиться, что повторные сообщения не отправляются в SQS. Это возможно только в том случае, если вы поддерживаете свой собственный издательский сервис. Это может быть идеальным решением, если у вас есть доступ к нему.
- Стандартная очередь SQS + EC2 + База данных
Вы можете использовать экземпляр EC2 вместо лямбды, чтобы можно было сохранить уже обработанные значения message_id в EC2. Это сохранит операции ввода-вывода базы данных при получении сообщения. Недостатком является то, что вы должны использовать опрос и затраты EC2 намного больше, чем использование лямбды.
- SQS FIFO Очередь + Лямбда (или EC2) + База данных + Опрос
Вы можете использовать Очередь FIFO и принудительно выполнять ее только один раз, чтобы гарантировать, что дубликаты сообщений не отправляются в SQS. Это включает в себя лямбда (используя CloudWatch) или и опрос экземпляра EC2 для сообщений. Это может быть связано с высокой производительностью, но мы можем обеспечить выполнение нашего требования.
На данный момент лямбда-триггер поддерживается только в стандартных очередях SQS. Следовательно, переход на FIFO не будет вариантом. Если мы посмотрим на практическую перспективу, вариант номер два будет идеальным решением. Это гораздо проще и понятнее, чем делать всю архитектуру спагетти. Надеюсь, это поможет.