최종 일관성

Eventual consistency

복제본 값이 잠시 달라도 업데이트 전파 후 같아지는 모델입니다.

···
html
<div class="scene"><div class="title">REPLICA PROPAGATION</div><div class="row replicas"><div class="tile">PRIMARY<br><b id="left">v1</b></div><div class="link"><span id="signal">→</span><small id="lagState">syncing</small></div><div class="tile">REPLICA<br><b id="right">v1</b></div></div><div id="consistency" class="muted">Both replicas agree</div></div>
css
.scene{width:min(94vw,760px);height:min(86vh,320px);padding:clamp(10px,2.5vmin,18px);border:1px solid var(--line);border-radius:14px;background:var(--surface);color:var(--fg);font:500 clamp(11px,1.3vw,16px)/1.25 "Pretendard Variable",Pretendard,-apple-system,sans-serif;display:flex;flex-direction:column;gap:clamp(7px,1.6vmin,12px);overflow:hidden}.scene *{box-sizing:border-box}.title{font-weight:750;color:var(--accent)}.muted{color:var(--muted)}.mono{font-family:ui-monospace,monospace}.row{display:flex;align-items:center;justify-content:center;gap:clamp(5px,1.4vmin,12px);flex:1;min-height:0}.tile{border:1px solid var(--line);border-radius:8px;background:var(--bg);padding:clamp(6px,1.6vmin,12px);text-align:center;min-width:0}.on{border-color:var(--accent)!important;background:color-mix(in srgb,var(--accent) 12%,var(--surface))!important}.pulse{animation:pulse 1.6s infinite alternate}@keyframes pulse{to{border-color:var(--accent);transform:translateY(-3px)}}.replicas .tile{flex:1}.replicas b{font:700 1.6em ui-monospace,monospace;color:var(--accent)}.link{min-width:22%;display:grid;text-align:center;color:var(--accent)}.link span{font-size:1.7em;animation:signal 1s infinite alternate}@keyframes signal{to{transform:translateX(16px)}}.link small{font-size:1em;color:var(--muted)}
js
let version=1,phase=0;function tick(){if(phase===0){version++;document.getElementById('left').textContent='v'+version;document.getElementById('consistency').textContent='Replica is temporarily stale';document.getElementById('lagState').textContent='in flight'}else{document.getElementById('right').textContent='v'+version;document.getElementById('consistency').textContent='Replicas converged';document.getElementById('lagState').textContent='synced'}phase=1-phase}tick();setInterval(tick,1100)

최종 일관성에서는 쓰기를 받은 노드의 값이 다른 복제본에 즉시 보이지 않을 수 있습니다. 전파가 계속되면 새 쓰기가 없는 구간에서 복제본들이 같은 값에 도달합니다.

데모는 왼쪽 복제본의 값이 먼저 바뀌고 화살표가 이동한 뒤 오른쪽이 따라오는 모습을 보여줍니다. 사용자가 자신의 쓰기를 바로 읽어야 한다면 별도 읽기 보장이 필요합니다.

언제 쓰나

짧은 불일치를 허용하고 가용성·지역별 읽기 성능이 중요한 데이터에 고려합니다.

페이지로 열기 ↗