이벤트 주도 아키텍처 및 이데모텐시 소개
이벤트 주도 아키텍처의 부상
현대 전자 상거래 시스템은 확장성과 응답성을 보장하기 위해 종종 이벤트 주도 아키텍처를 사용합니다. 예를 들어, 사용자가 주문을하는 경우 “주문 완료”, “결제 완료”, “재고 업데이트”와 같은 이벤트가 비동기적으로 트리거됩니다.
분산 시스템에서 이데모텐시의 중요성
분산 시스템에서 이벤트는 네트워크 장애로 인해 중복되거나 재시도 될 수 있으며, 중복 주문 또는 잘못된 재고 조정과 같은 문제를 야기할 수 있습니다. 이데모텐시는 한 이벤트를 여러 번 처리해도 한 번 처리한 것과 동일한 결과를 내도록 보장합니다.
이데모텐시 이해
이데모텐시란?
이데모텐시는 작업이 실행된 횟수에 관계없이 동일한 효과가 발생함을 보장합니다. 예를 들어, 네트워크 장애로 인해 “주문하기” API가 두 번 호출되면 오직 하나의 주문만 생성되어야 합니다.
이데모텐시 vs. 다른 오류 허용 메커니즘
이데모텐시는 재시도 시 정확성에 중점을 두는 반면, 재시도나 서킷 브레이커와 같은 오류 허용 메커니즘은 실패를 다루지만 중복을 방지하지는 않을 수 있습니다.
이데모텐시 달성에 따른 도전과제
중복 이벤트의 일반적인 원인
- 네트워크 오류: AWS API Gateway와 같은 API 게이트웨이는 응답을 신속하게 받지 못할 경우 요청을 재시도할 수 있습니다.
- 재시도 및 확인 지연: 결제 게이트웨이는 확인이 지연될 경우 “결제 확인” 이벤트를 다시 보낼 수 있습니다.
- 결함 있는 프로듀서나 소비자: 전자상거래 체크아웃 마이크로서비스가 시스템의 버그로 인해 중복 “주문 생성됨” 이벤트를 발생시킬 수 있습니다.
아이덴포텐시 없이의 잠재적 함정
- 데이터 불일치: 중복 “재고 업데이트” 이벤트를 처리하면 잘못된 재고 수준으로 이어질 수 있습니다.
- 비즈니스 로직 오류: 동일한 주문에 대해 고객에게 두 번 요금을 부과하면 신뢰를 손상시키고 환불 문제를 일으킵니다.
전자상거래 프로세스 흐름도
다음 다이어그램은 전자상거래 플랫폼의 다양한 구성 요소 간의 작업 및 상호 작용의 순서를 보여줍니다. 이 다이어그램은 고객이 제품을 탐색하고 구매를 완료하며 주문을 추적하는 여정을 강조합니다. 일반적으로 이 다이어그램은 사용자 상호 작용, 백엔드 시스템 워크플로우, 결제 처리, 재고 업데이트 및 배송 메커니즘과 같은 핵심 프로세스를 포함합니다. 흐름은 다양한 구성 요소가 어떻게 상호 작용하여 원활한 쇼핑 경험을 제공하는지에 대한 전체적인 관점을 제공합니다. 또한 결제 처리 및 재고 업데이트와 같은 중요한 워크플로우에서 멱등성을 구현하면 네트워크 장애나 재시도 상황에서도 시스템이 신뢰할 수 있고 일관성을 유지할 수 있습니다. AWS 서비스인 AWS SQS FIFO 큐, DynamoDB, SNS를 도입하면 이벤트 중심 아키텍처에서 멱등성을 구현하는 것이 크게 간소화될 수 있습니다.
다이어그램의 주요 프로세스
1. 사용자 탐색 및 검색
- 사용자는 제품 카탈로그를 탐색하거나 특정 항목을 검색합니다.
- 백엔드는 일반적으로 AWS ElastiCache를 사용하여 더 빠른 결과를 위해 캐시된 제품 카탈로그 서비스에서 데이터를 검색합니다.
2. 위시리스트 관리
- 사용자는 품목을 위시리스트에 추가할 수 있습니다.
- 작업은 동일한 제품이 여러 번 추가되지 않도록 멱등성을 보장합니다.
3. 장바구니에 추가 및 체크아웃
- 제품이 쇼핑 카트에 추가되어 중복을 방지하기 위해 멱등성 수량 조정이 보장됩니다.
- 결제 시, 시스템은 카트 내용을 확인하고 총 가격을 계산합니다.
4. 결제 처리
- 결제 게이트웨이가 거래를 시작합니다.
- 멱등성은 게이트웨이 타임아웃으로 인한 재시도가 발생하더라도 단일 결제가 처리되도록 보장합니다.
5. 주문 배치
- 결제가 성공적으로 이루어지면 “주문 완료” 이벤트가 트리거됩니다.
- 시스템은 주문 기록을 생성하고, 멱등성이 중복 주문 생성을 방지합니다.
6. 재고 업데이트
- 재고는 배치된 주문에 따라 조정됩니다.
- 멱등성 업데이트는 중복 또는 재시도 이벤트가 발생하더라도 재고 수준이 정확하도록 보장합니다.
7. 주문 이행 및 배송
- 주문 상태는 “처리 중”, “배송 중”, “배송 완료”와 같은 단계로 진행됩니다.
- 업데이트는 중복 이벤트로 인한 잘못된 상태 변경을 방지하기 위해 멱등적입니다.
8. 주문 추적 및 알림
- 사용자는 자신의 주문 상태를 확인할 수 있습니다.
- 알림(예: 이메일/SMS)은 중복으로 사용자에게 스팸을 보내지 않도록 멱등적으로 전송됩니다.
멱등성 요구 사항
1. 카트 업데이트
같은 제품을 두 번 추가하면 수량이 업데이트되어야 하며 중복 카트 항목이 생성되어서는 안 됩니다.
- 구현: 고유한 카트 항목 식별자와 조건부 업데이트를 DynamoDB에 사용합니다.
2. 결제 게이트웨이
결제 재시도는 중복 청구로 이어지지 않아야 합니다.
- 구현: 완료된 거래를 추적하기 위해 DynamoDB에 저장된
IdempotencyKey
를 사용합니다.
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