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

분산 컴퓨팅 분야에서 일관성을 말할 때 자주 언급되는 것이 Eventual Consistency이다. 간단하게 말하자면 단기적으로 일관성을 잃더라도 결국에는 일관성을 유지하는 모델을 뜻하는데 이 용어는 더글라스 테리 외에 의해 만들어졌고 워너 보겔스에 의해 대중화되었다고 한다.[1]

일관성을 데이터 관점으로 좁혀보면 데이터 정합성整合性으로 이어진다. 전통적으로 관계형 데이터베이스에서는 테이블 간 데이터 정합성을 지키는 방법으로 기본 키Primary Key나 외래 키Foreign Key 같은 제약과 트랜잭션을 사용한다. 하지만 분산 환경에서는 엄격하게 제어하기 어려울뿐더러 할 수 있더라도 자원을 많이 소비한다.

데이터 변경과 이벤트 메시지 발행은 데이터베이스 트랜잭션 안에서 이루어진다. 문제는 이벤트 발행에 사용하는 메시지 브로커에는 데이터베이스 트랜잭션을 함께 사용할 수 없다는 것이다. 따라서 데이터베이스에 데이터 변경이 성공했지만 이벤트 발행에 실패하거나 혹은 이벤트 발행은 성공했지만 데이터베이스 반영은 실패한다면 서비스 간 데이터 일관성이 깨지고 만다.  - https://www.popit.kr/msa에서-메시징-트랜잭션-처리하기/

예전에 운영했던 주문 시스템에서의 일이다. 주문 프로세스의 끝에 구매자에게 휴대전화 문자나 SNS로 '주문 완료' 알림을 보내는 것이 있었다. 알림을 담당하는 시스템은 별도로 존재하고 있어서 데이터베이스 트랜잭션으로 제어하기 어려웠다. 그렇다고 알림이 실패하면 주문을 롤백 할 수는 없는 노릇이었다. 문제를 해결하기 위해서 2단계로 처리했는데 먼저 주문 트랜잭션과 함께 알림 정보를 데이터베이스 테이블에 넣고나서 트랜잭션과 상관없이 주기적으로 배치Batch 프로그램으로 실행하여 알림 테이블 정보를 읽어 알림 시스템과 연동했다.  - https://www.popit.kr/golang에서-카프카-컨슈머-그룹과-재시도로-결과적-일관/

필자는 아마존에서 Eventual Consistency를 경험을 했다.

얼마 전 필자가 아마존에서 전자책을 샀을 때의 일이다. 필자의 아마존 계정에 추가해 둔 결제 수단이 문제(유효기간이 만료된 신용카드)가 있다는 것을 모르고 전자책을 구매하였다. 책은 구매 되었으며 볼 수 있었다. 다만 아마존으로부터 결제 수단 오류로 결제가 되지 않았다는 메일을 받았다. 필자는 결제 수단을 올바른 것을 수정하였지만 바로 결제가 되지 않았다. 그리고 이틀 정도 흐른 후 결제가 되었다는 문자를 받았다. - https://www.popit.kr/rest-기반의-간단한-분산-트랜잭션-구현-3편-tcc-confirmeventual-consistency/

이러한 Eventual Consistency를 ‘결과적 일관성’과 '최종적 일관성'으로 혼용하여 번역하고 있는 것을 발견했다.

이미지 출처 : yes24.com

이미지 출처 : yes24.com

규칙 : 경계의 밖에선 결과적 일관성을 사용하라. 에릭 에반스는 이에 관해 아주 간단하면서도 올바른 지침을 알려줬다. 유스케이스를 논의할 때 데이터의 일관성을 보장하는 주체가 유스케이스를 수행하는 사용자의 일인지 질문해보자. 만약 그렇다면, 다른 애그리게잇의 규칙을 고수하는 가운데 트랜잭션을 통해 일관성을 보장하도록 하자. 만약 다른 사용자가 시스템이 해야 할 일이라면 결과적 일관성을 선택하자. - 도메인 주도 설계 구현, 472쪽
이미지 출처 :  yes24.com

이미지 출처 : yes24.com

주문을 받고 처리했다는 사실은 우리가 나중에 창고의 수집 테이블에 삽입을 재시도하기에 충분하다. 우리는 이 연산의 일부를 큐나 로그 파일에 큐잉하여 나중에 재시도할 수 있다. 이런 재시도 방법이 의미가 있는 몇 가지 연산에 대해서는 재시도로 해결될 것이라고 추정해야 한다. 이것은 여러모로 최종적 일관성eventual consistency의 또 다른 형태이다. 트랜잭션이 완료되었을 때 시스템이 일관성을 유지하는 상태임을 보장하기 위해 트랜잭션 경계를 사용하는 대신 향후 특정 시점에 시스템이 스스로 일관성을 유지하는 상태가 될 수 있음을 허용한다. -  마이크로서비스 아키텍처 구축 5.12.1 나중에 재시도하기

이미지 출처 : yes24.com

이미지 출처 : yes24.com

데이터베이스에 쓰기를 멈추고 잠시 동안 기다리면 팔로워는 결국 따라잡게 되고 리더와 일치하게 된다. 이런 효과를 최종적 일관성이라 한다. - 데이터 중심 애플리케이션 설계, 164쪽

국어사전을 찾아보니

먼저 두 낱말의 차이를 알아보기 위해 국어사전을 찾아보았다.

최종-적 最終的 (명사) 맨 나중의 것. (관형사) 맨 나중의. - https://ko.dict.naver.com/#/entry/koko/9203941500ee4e02bd6a161b6cebc2cb
결과-적 結果的 (명사) 어떤 원인으로 생기는 결말의 상태로 되는 것. (관형사)어떤 원인으로 생기는 결말의 상태로 되는. - https://ko.dict.naver.com/#/entry/koko/ffb4208f7e86454aa611d5dcbc58fdc9

예문으로 낱말의 어감을 찾아보니 필자의 느낌으로는 '최종적으로'라는 말이 더 격식을 차릴 때 쓰는 것으로 느껴졌다.

네이버 검색 결과

네이버 검색 결과

국립 국어원에 물어보니

두 가지 낱말 중 어느 것이 우리말스러운지 궁금했다. 필자는 국문학 전공자가 아니기 때문에 국립 국어원에 질문을 했다.

https://www.korean.go.kr/front/onlineQna/onlineQnaView.do?mn_id=216&qna_seq=193319&pageIndex=1

https://www.korean.go.kr/front/onlineQna/onlineQnaView.do?mn_id=216&qna_seq=193319&pageIndex=1

그 결과는 “모두 쓸 수 있는 표현”이라는 답변을 받았다.

그렇다면 얼마나 쓰일까?

구글 검색으로 사용 빈도를 알아보았다.

구글 검색 결과

구글 검색 결과

‘결과적 일관성’이 ‘최종적 일관성’보다 2배 정도 많이 사용하고 있었다.

그래서 결과적 일관성인가? 최종적 일관성인가?

필자는 Eventual Consistency 설명할 때 ‘결국’이라는 말을 사용한다.

단기적으로 일관성을 잃더라도 결국에는 일관성을 유지하는 모델

‘결국’이라는 낱말은 ‘결과’로 이어진다.

결국 結局 일이 마무리되는 마당이나 일의 결과가 그렇게 돌아감을 이르는 말. - 네이버 사전https://ko.dict.naver.com/#/entry/koko/9d241d94054d4a01893af30a8517b0a0

그래서 자연스럽게 ‘결과적 일관성’이라고 쓰고 있다.

필자는 ‘최종적’이라는 말이 입이 잘 붙지 않는다. 왜냐하면 일상적인 대화에서 잘 쓰지 않기 때문이었다. 물론 ‘결과적’이라는 말도 매한가지만 위의 예문에서 본 것과 같이 ‘최종적’보다는 덜 딱딱한 느낌이다.

마치며

사실 이런 것들은 답이 없을뿐더러 또한 답을 내기 위해 이 글을 쓰고 있는 것도 아니다. 다만 영어를 우리말로 옮길 때 어떤 낱말이 더 이해하는데 좋을까를 생각해 보았다.

주석

[1] 데이터 중심 애플리케이션 설계, 164쪽


Popit은 페이스북 댓글만 사용하고 있습니다. 페이스북 로그인 후 글을 보시면 댓글이 나타납니다.