Causal Consistency란 무엇인가
분산 시스템에서 여러 서버(노드)에 데이터를 복제해두면 성능과 가용성은 좋아지지만, 모든 노드가 항상 똑같은 순서로 데이터를 보게 만들기는 어렵습니다. 이때 ‘강한 일관성(Strong Consistency)’은 모든 노드가 항상 동일한 순서로 데이터를 보도록 강제하지만, 그만큼 속도가 느려집니다. 반대로 ‘최종 일관성(Eventual Consistency)’은 속도는 빠르지만 순서를 전혀 보장하지 않아 혼란스러운 상황이 생길 수 있습니다.
Causal Consistency(인과적 일관성)는 이 둘의 중간 지점입니다. 서로 ‘인과 관계(causality)’가 있는 이벤트, 즉 원인과 결과로 연결된 작업들에 대해서만 순서를 보장하고, 서로 관련 없는 이벤트들은 순서를 보장하지 않아도 된다는 모델입니다. 덕분에 강한 일관성보다 빠르면서도, 최종 일관성보다 훨씬 예측 가능한 동작을 제공합니다.
동작 원리와 예시
가장 흔한 예시는 SNS 댓글입니다. 사용자 A가 ‘오늘 날씨 좋다’라는 글을 올리고, 사용자 B가 그 글을 보고 ‘진짜 맑네요’라는 댓글을 달았다고 해봅시다. 이 두 이벤트는 인과 관계가 있습니다. B의 댓글은 A의 글을 원인으로 해서 발생했기 때문입니다.
만약 시스템이 인과적 일관성을 보장하지 않는다면, 어떤 사용자 C가 접속했을 때 원문 글 없이 댓글만 먼저 보이는 이상한 상황이 발생할 수 있습니다. 원인 없는 결과가 보이는 셈이죠. 인과적 일관성을 보장하는 시스템은 이런 순서 역전을 막아, 항상 원문 글이 먼저 보이고 그 다음 댓글이 보이도록 순서를 지켜줍니다.
반면 A의 글과 전혀 관계없는 사용자 D의 다른 글은, C가 어떤 순서로 보든 상관이 없습니다. 서로 인과 관계가 없기 때문입니다. 이렇게 관계 없는 이벤트끼리는 순서를 자유롭게 둠으로써 성능 저하를 최소화하는 것이 핵심 아이디어입니다.
이를 구현할 때는 보통 각 이벤트에 ‘버전 벡터(Version Vector)’나 ‘벡터 시계(Vector Clock)’ 같은 메타데이터를 붙여, 어떤 이벤트가 어떤 이벤트보다 먼저 발생했는지 추적합니다. 노드는 이 정보를 이용해 자신이 아직 받지 못한 원인 이벤트가 있다면, 그 이벤트가 도착할 때까지 결과 이벤트를 사용자에게 보여주지 않고 대기합니다.
실무에서 왜 쓰이는가
Causal Consistency는 다음과 같은 상황에서 실무적으로 유용합니다.
- SNS, 채팅, 협업 툴처럼 사용자 경험상 ‘순서’가 중요한 서비스
- 전 세계에 분산된 데이터베이스에서 지연 시간을 줄이면서도 최소한의 논리적 순서는 지키고 싶을 때
- MongoDB, Azure Cosmos DB 등 일부 분산 DB는 Causal Consistency를 세션 단위로 제공해, 개발자가 선택적으로 적용할 수 있게 함
결국 Causal Consistency는 ‘모든 걸 완벽히 맞추지는 않지만, 말이 안 되는 순서는 절대 보여주지 않겠다’는 실용적인 타협점입니다. 시스템 설계 시 일관성과 성능 사이에서 균형을 잡아야 한다면, 강한 일관성과 최종 일관성 사이에 있는 이 모델을 검토해볼 가치가 있습니다.