-
Eventual Consistency란?프로젝트/선착순 쿠폰 발급 시스템 2023. 4. 19. 00:01728x90
Eventual Consistency란?
번역하자면 최종적 일관성이라는 의미입니다.
간단히 말하면 "고객이 한번 실행했던 기능은 반드시 처리되어야 한다"라는 것입니다.
10분이 지나던 며칠이 지나던 지금 당장은 아니더라도, 언젠가 반드시 된다는 보장을 해줍니다.
유저의 주문, 결제 시나리오 예시
- 유저가 주문을 발행했습니다.
- 재고가 차감됩니다.
- 결제가 시도됩니다.
- 구매 주문이 데이터베이스에 저장됩니다.
- 재고 차감이 확정됩니다.
- 결제가 확정됩니다.
이때 결제가 확정되다가 실패가 되면 주문이 실패했다고 보아야 할까요?
이렇게 되면 결제의 실패가 주문의 실패로 이어지게 되고 비즈니스 관점에서 판매자는 판매의 기회를 잃게 됩니다.
즉, 주문이 전달되면 언젠가(미래 특정 시점) 해당 서비스를 책임지고 결제를 처리해 준다고 믿고 클라이언트에게 성공을 반환합니다.
이벤트가 유실되는 경우?
만약 8개의 마이크로서비스가 존재하면 각 마이크로서비스는 내 서비스와 연관이 있는 Event를 받아서 내 서비스에 맞게 데이터를 가공하여 저장한 후, 어떤 처리가 끝나면 다음 Event를 발생시키면 됩니다.
여기서 가장 중요한 점은 이벤트는 반드시 전달되어야 합니다.
이벤트 처리 과정 중 특정 서비스에 장애가 발생해도, 또는 엄청난 트래픽에 시스템이 버벅거리고 있다 하더라도 Event는 반드시 전달되어야 합니다.
RabbitMq, Kafka등을 사용하면 큐 자체가 이것을 보장해 줍니다.
데이터가 불일치가 길어지면?
만약 서비스에 장애상황이 오래간다면, 사용자는 불일치된 데이터를 표시하는 화면을 오래 볼 수도 있습니다.
이럴 때 사용하는 방법은 PENDING이라는 메시지를 출력해 주는 방법입니다.
내부적으로 처리됨을 표시하여 사용자에게 알려줄 수 있습니다.
비동기 통신이기 때문에 사용자는 다른일을 하고 있을 수 있습니다.
모든 트랜잭션이 끝나고 이벤트를 한번 더 발생시켜 (All-done 이벤트) 상태값을 정상으로 변경할 수 있습니다.
참고자료
https://www.popit.kr/내-멋대로-구현한-이벤트-드리븐/
https://www.popit.kr/rest-기반의-간단한-분산-트랜잭션-구현-3편-tcc-confirmeventual-consistency/
https://www.msaschool.io/operation/integration/integration-four/
'프로젝트 > 선착순 쿠폰 발급 시스템' 카테고리의 다른 글
Docker로 Spring + Kafka 실행하기 (0) 2023.04.22 kafka 모듈 구성하기 (0) 2023.04.20 서킷 브레이커 구성하기 (0) 2023.02.28 Client 모듈 구성하기 (0) 2023.02.27 코틀린 멀티모듈 프로젝트 구성하기 (0) 2023.02.23