• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

CQRS 관련 질문

21.05.30 17:36 작성 조회수 217

1

안녕하세요.

강의에 걸쳐서 배민은 CQRS를 도입하여 사용한다고 말씀해주신 부분이 기억나서 관련하여 정보들을 많이 찾아보고 있습니다.

그 중 한가지 질문이 생겼는데요.

명령 저장소와 조회 저장소를 분리해서 사용하는 경우 명령 저장소에 데이터 저장 후 이벤트 버스를 통해 조회 저장소에 데이터를 동기화 시킨다고 알고 있습니다.

그런데 만약 조회 쿼리가 발생했는데 해당 데이터가 최신이 아닌 경우 즉, 이벤트를 컨슈밍하여 동기화하기 직전 그 찰나의 순간인 경우를 대비할 수 있는 방법이 있을까요?

1. 이벤트를 처리하지않았기 때문에 조회 당시의 시점으로 봤을 때 동기화되기 이전의 데이터가 최신 데이터라고 보는게 맞음

2. 최신 데이터를 가져오는 것이 정말 중요한 요구사항으로 발생할 가능성이 적음.

3. 이벤트 드리븐의 특성에 따라 최종적 일관성에 대해 집중하는게 좋음.

대략 위 3가지정도의 이유로 인해 최신 데이터에 대한 걱정을 할 필요가 없을 것 같기도합니다만..아직 실무에서 CQRS를 겪어보지 않아서 어떻게 판단해야할지 헷갈리네요.

관련하여 영한님의 생각을 듣고 싶습니다 :)

감사합니다.

답변 1

답변을 작성해보세요.

0

안녕하세요. teamhide

이벤트 방식으로 데이터를 동기화하면 짧게는 수백ms ~ 수초 정도의 동기화 시간이 발생합니다.

여기서는 사실 기술적인 문제 뿐만 아니라 비즈니스 상황을 고려해서 결정 해야합니다.

예를 들어서 쿠폰의 유효성 검증, 계좌 이체와 같이 매우 크리티컬하게 동기화가 중요하다면, 최종적 일관성을 사용하면 안됩니다.

반면에 상품의 이미지나, 설명이 변경되는 정도라면 충분히 더 늦게 반영되어도 되겠지요?

감사합니다.

teamhide님의 프로필

teamhide

질문자

2021.05.30

맞는 말씀입니다. 그렇다면 말씀해주신 계좌이체처럼 동기화가 중요한 요구사항의 경우 어떤 형식으로 대처해야할까요?

1. 읽기 저장소가 아닌 명령 저장소를 직접 접근하여 조회한다.

2. 명령 저장소에 저장 후 이벤트를 발행하는것이 아닌 직접 읽기 저장소에 접근하여 업데이트한다.

대략 위처럼 2가지의 방법을 생각해봤는데 실무에선 어떤 방법을 사용하나요?

이런 경우 최근에는 마이크로서비스로 많이 되어 있는데, 주로 명령 저장소를 제공하는 시스템의 실시간 API를 직접 호출하게 됩니다. 감사합니다.

teamhide님의 프로필

teamhide

질문자

2021.05.31

혹시 rest api콜을 말씀하시는걸까요?

네 맞습니다^^

teamhide님의 프로필

teamhide

질문자

2021.06.01

감사합니다!!