Введение в архитектуру, ориентированную на события и идемпотентность
Развитие архитектуры, ориентированной на события
Современные системы электронной коммерции часто зависят от архитектуры, ориентированной на события для обеспечения масштабируемости и отзывчивости. Например, когда пользователь размещает заказ, асинхронно запускаются события, такие как “Заказ размещен”, “Оплата обработана” и “Инвентарь обновлен”.
Почему идемпотентность важна в распределенных системах
В распределенных системах события могут быть дублированы или повторно отправлены из-за сбоев в сети, что приводит к проблемам, таким как дублирование заказов или неправильные корректировки инвентаря. Идемпотентность гарантирует, что обработка события несколько раз дает тот же результат, что и однократная обработка.
Понимание идемпотентности
Что такое идемпотентность?
Идемпотентность гарантирует, что операция имеет одинаковый эффект независимо от того, сколько раз она выполняется. Например, если API “Разместить заказ” вызывается дважды из-за сбоя в сети, должен быть создан только один заказ.
Идемпотентность против других механизмов обеспечения отказоустойчивости
Идемпотентность сосредоточена на корректности при повторных попытках, в то время как механизмы обеспечения отказоустойчивости, такие как повторы или переключатели цепи, занимаются сбоями, но могут не предотвращать дубликаты.
Проблемы в достижении идемпотентности
Общие причины дублирующихся событий
- Сбои в сети: API-шлюз, такой как AWS API Gateway, может повторить запрос, если ответ не получен вовремя.
- Повторы и задержки подтверждения: Платежный шлюз может повторно отправить событие “Подтверждение платежа”, если подтверждение задерживается.
- Неисправные производители или потребители: Микросервис оформления заказа в электронной коммерции может генерировать дублирующиеся “События создания заказа” из-за ошибки в системе.
Потенциальные подводные камни без идемпотентности
- Несоответствия данных: Обработка дублирующихся “Событий обновления запасов” может привести к неправильным уровням запасов.
- Сбои бизнес-логики: Двукратное взимание платы с клиента за один и тот же заказ подрывает доверие и создает проблемы с возвратом.
Диаграмма процесса электронной коммерции
Следующая диаграмма иллюстрирует последовательность операций и взаимодействий между различными компонентами платформы электронной коммерции. Она выделяет путь клиента от просмотра продуктов до завершения покупки и отслеживания заказа. Обычно в этой диаграмме включены основные процессы, такие как взаимодействие с пользователем, рабочие процессы бэкенд-систем, обработка платежей, обновление инвентаря и механизмы доставки. Этот поток обеспечивает всесторонний просмотр того, как различные компоненты взаимодействуют для обеспечения безупречного опыта покупок. Также внедрение идемпотентности в критических рабочих процессах, таких как обработка платежей и обновление инвентаря, гарантирует, что система остается надежной и последовательной даже в случае сбоев сети или повторных попыток. Применение некоторых услуг AWS как AWS SQS FIFO-очереди, DynamoDB и SNS может значительно упростить внедрение идемпотентности в событийно-ориентированные архитектуры.
Ключевые процессы на диаграмме
1. Просмотр и поиск пользователем
- Пользователи просматривают каталог товаров или ищут конкретные предметы.
- Бэкенд получает данные от Сервиса каталога товаров, часто кэшируемые с использованием AWS ElastiCache для более быстрых результатов.
2. Управление списком желаемого
- Пользователи могут добавлять товары в свой список желаемого.
- Операции идемпотентны, чтобы гарантировать, что один и тот же продукт не добавляется несколько раз.
3. Добавление в корзину и оформление заказа
- Товары добавляются в корзину, обеспечивая идемпотентные изменения количества, чтобы избежать дублирования.
- На этапе оформления заказа система проверяет содержимое корзины и рассчитывает общую цену.
4. Обработка платежей
- Платежный шлюз инициирует транзакцию.
- Идемпотентность гарантирует, что будет обработан только один платеж, даже если повторные попытки происходят из-за тайм-аутов шлюза.
5. Размещение заказа
- После успешной оплаты инициируется событие “Заказ размещен”.
- Система создает запись заказа, а идемпотентность предотвращает создание дубликатов заказов.
6. Обновление запасов
- Запасы корректируются на основе размещенного заказа.
- Идемпотентные обновления обеспечивают точность уровней запасов, даже при дублирующих или повторных событиях.
7. Исполнение и доставка заказа
- Статус заказа проходит через стадии, такие как “В обработке”, “Отправлен” и “Доставлен”.
- Обновления являются идемпотентными, чтобы избежать неправильных изменений статуса из-за дублирующих событий.
8. Отслеживание заказов и уведомления
- Пользователи могут проверять статус своего заказа.
- Уведомления (например, по электронной почте/SMS) отправляются идемпотентным образом, чтобы избежать спама пользователям дубликатами.
Требования к идемпотентности
1. Обновления корзины
Добавление одного и того же товара дважды должно обновлять количество, а не создавать дублирующие записи в корзине.
- Реализация: Используйте уникальный идентификатор элемента корзины и условное обновление в DynamoDB.
2. Платежный шлюз
Повторные попытки оплаты не должны приводить к дублированию списаний.
- Реализация: Используйте
IdempotencyKey
, хранящийся в DynamoDB, для отслеживания завершенных транзакций.
3. Размещение заказа
Дублированные события “Заказ создан” при повторной попытке не должны создавать несколько заказов.
- Реализация: Используйте уникальный
orderID
и условную операциюPutItem
в AWS DynamoDB.
4. Обновление инвентаря
Изменение уровня запасов должно учитывать повторные попытки, чтобы избежать избыточного уменьшения.
- Реализация: Используйте распределенные блокировки (например, с AWS DynamoDB TTL) для обработки одновременных обновлений.
5. Уведомления
Уведомления по электронной почте или SMS, вызванные событием, должны быть отправлены только один раз.
- Реализация: Используйте ключ дедупликации с сервисами типа Amazon Simple Notification Service (SNS).
Заключение
В системах, ориентированных на события, особенно в платформах электронной торговли и облачных архитектурах, таких как AWS, идемпотентность является необходимым условием для обеспечения надежности, отказоустойчивости и согласованности данных. Реализуя надежные идемпотентные шаблоны и используя инструменты, такие как DynamoDB, SQS и SNS, разработчики могут снизить риски, связанные с повторными попытками и дублирующими событиями. Этот гид демонстрирует, как принятие этих практик не только улучшает надежность системы, но и создает доверие пользователей, предоставляя бесперебойный и безошибочный опыт. Поскольку спрос на устойчивые и масштабируемые системы растет, овладение идемпотентностью становится краеугольным камнем современного проектирования программного обеспечения.
Source:
https://dzone.com/articles/idempotency-and-reliability-in-event-driven-systems