IT/소프트웨어 공학

결과적 일관성 (Eventual Consistency)이란?

yeTi 2023. 2. 27. 16:49

안녕하세요. yeTi입니다.
오늘은 Eventual Consistency 에 대해 다뤄보고자 합니다. 유영모님의 가이드를 따라가다가 거대한 자료의 수집채로 해당글을 씁니다.

정의

Eventual consistency에 따르면 결과적 일관성은 분산 환경에서 고가용성을 보장하기 위한 일관성 모델이라고 설명하고 있습니다.

Eventual consistency is a consistency model used in distributed computing to achieve high availability that informally guarantees that, if no new updates are made to a given data item, eventually all accesses to that item will return the last updated value.

일관성 모델(consistency model) 의 대상은 distributed shared memory systems 이나 filesystems, databases, optimistic replication systems or web caching과 같은 distributed data stores 입니다.

맥락 (Context)

결과적 일관성(eventual consistency)을 가져야하는 이유는 결국 서비스가 분산 환경에 놓여지게된 배경과 동일하게 볼 수 있습니다.

모든 비즈니스를 아우르는 하나의 서비스를 만들어도 되는데 왜 분산 환경을 선택하는 업체가 많아질까요?

이는 간결하게 MSA의 유행과 일맥상통한다고 생각합니다.

MSA를 하는 이유 에서 키워드로 Loosely-Coupled를 언급했습니다. 비즈니스 유연성을 극대화하기 위해 도메인별 책임의 분업, 그에 따른 개발 유연성의 증가가 결국 물리적인 분산 환경을 가지게되는 이유라고 생각합니다.

분산 환경에 놓이게 되다보니 자연스럽게 DBMS에서 제공하는 트랜젝션을 활용하여 데이터 일관성을 유지할 수 없게 되었고, 결과적 일관성(eventual consistency)에 대한 고민으로 이어지게 되었다고 생각합니다.

보다 자세한 배경은 아래 참고 문헌의 자료들을 시간을 가지고 천천히 읽어보시는것을 추천드립니다.

어떻게?

사실 제가 유영모님께 드린 질문은 여기서 출발했습니다.

어떻게 결과적 일관성 (Eventual Consistency)을 가지도록 구현할 수 있을까요?
책이나 구체적인 자료가 있을까요?

감사하게도 영모님께서 답변을 주셨고, 전달해주신 가이드의 참조를 따라다니다 보니 어마어마한 양의 경험을 간접적으로 경험하게 되었습니다.

최종적으로 알아낸것은 결과적 일관성 (Eventual Consistency) 을 구현하기 위한 정답은 없다는 것입니다.

그래도 대외적으로 나타내기 위한 신뢰성있고 확실한 방향성은 Chris Richardson 이 운영하는 가이드 서비스에서 제시하는 여러 MSA Pattern들을 적용하는 것입니다.

아니면 제 생각에 보다 쉬운 가이드적인 자료는 안영회님의 마이크로 서비스 공부하게 책 하나 추천해주세요가 적정한 가이드를 제공하지 않을까 싶습니다.

아차차, 위의 예시는 전체적인 맥락을 포착하기 위해 유용하다는 의미였고 유영모님께서 제시해주신 가이드도 굉장히 실질적인 예시가 포함되어 있어 구체적인 가이드로 추천드립니다.

느낀점

결국 결과적 일관성 (Eventual Consistency)이란 우리가 만들고자 하는 서비스를 잘 만들기 위한 목표일뿐 어떻게 그 목표에 도달할지는 개인과 팀, 회사의 선택이라는 생각이 들었습니다.

하나하나 접근하다보면 서비스의 경계, 이벤트에 대한 정의, 오류/예외 처리, 모니터링 등 정의 혹은 선택, 결정의 연속일 것입니다.

이러한 연속적인 선택속에서 중요한 것은 멋진 기술을 활용해서 결과적 일관성 (Eventual Consistency)을 구현했느냐 보다 팀이 가진 퍼포먼스내에서 우리의 서비스를 만들어가기 위해 알맞은 선택을 했느냐와 서비스를 성장시키기 위해 팀은 성장했느냐가 아닌가 라는 생각이 듭니다.

참고 문헌

결과적 일관성인가? 최종적 일관성인가?

MSA에서 메시징 트랜잭션 처리하기

Golang에서 카프카 컨슈머 그룹과 재시도로 결과적 일관성 구현하기

REST 기반의 간단한 분산 트랜잭션 구현 - 1편

REST 기반의 간단한 분산 트랜잭션 구현 - 2편 TCC Cancel, Timeout

REST 기반의 간단한 분산 트랜잭션 구현 - 3편 TCC Confirm(Eventual Consistency)

REST 기반의 간단한 분산 트랜잭션 구현 - 4편 REST Retry