Введение в проблему обработки дубликатов
Обработка дубликатов является одной из проблем, которая выглядит незначительной на схемах, но может быть очень дорогой в производстве. Я видел, как команды создают чистые событийно-ориентированные и основанные на Lambda системы, но сталкиваются с дубликатами зарядов, дубликатами электронных писем, повторными записями вниз по потоку или несоответствующим состоянием, когда начинаются повторы и повторные попытки. Трудная часть заключается в том, что система часто работает так, как задумано. Службы AWS делают то, что должны делать: повторяют, буферизируют, повторно запускают и отдают предпочтение целостности доставки.
Idempotентность как ключевая концепция
Idempotентность является одним из наиболее важных и недооцененных тем в инженерии без серверов. Idempotентность означает, что можно безопасно обрабатывать одну и ту же логическую запрос несколько раз и все равно получить один и тот же ожидаемый результат. Это не означает, что система получает запрос только один раз. Это означает, что система устойчива, когда она получает его несколько раз.
Миф об обработке ровно один раз
Многие ошибки в производстве начинаются с предположения, что серверный поток будет обрабатывать каждый запрос ровно один раз. На практике в распределенных системах получается следующее:
- доставка как минимум один раз (обычно с очередями/событиями)
- повторы на нескольких уровнях (клиентские SDK, службы AWS, Lambda, Step Functions и т. д.)
- тайм-ауты и неоднозначные результаты (закончилась ли функция, но вызывающая сторона завершила время ожидания?)
- повторная обработка/повтор (переработка DLQ, воспроизведение архива, ручные повторы)
- дубликатные подачи с клиента
Выбор ключей idempotентности и окон дедупликации
Для реализации idempotентности необходимо выбрать ключи idempotентности и окна дедупликации. Ключи idempotентности должны быть уникальными для каждого запроса и позволять системе определить, был ли уже обработан этот запрос. Окна дедупликации определяют, в течение какого времени система будет хранить информацию об уже обработанных запросах.
Дизайн хранилища idempotентности на базе DynamoDB
Одним из вариантов реализации хранилища idempotентности является использование DynamoDB. Это позволяет хранить информацию об уже обработанных запросах и быстро проверять, был ли уже обработан запрос.
Обработка повторов из API Gateway, SQS и EventBridge
Для обработки повторов из API Gateway, SQS и EventBridge необходимо использовать соответствующие инструменты и технологии. Например, можно использовать AWS Lambda Powertools idempotency utility для обработки повторов.
Практическая реализация idempotентности
Реализация idempotентности требует тщательного рассмотрения архитектуры системы и выбора подходящих инструментов и технологий. Необходимо учитывать все возможные сценарии обработки дубликатов и повторов, чтобы обеспечить правильную работу системы.