SQLite 기반 엣지 액터

SQLite-backed edge actors

식별자별 실행 객체가 자신의 SQLite 상태를 보관합니다.

···
html
<div class="scene"><div class="title">ACTOR STATE SURVIVES RESTART</div><div class="row actors"><div class="tile" id="actorA">ACTOR A<div id="countA">0</div></div><div class="tile" id="actorB">ACTOR B<div id="countB">0</div></div></div><div class="storage">SQLite A <span id="storeA">0</span> · SQLite B <span id="storeB">0</span></div><div class="muted" id="actorState">Requests update isolated state</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)}}.actors .tile{flex:1}.actors .tile div{font:700 1.8em ui-monospace,monospace;color:var(--accent);margin-top:6px}.storage{border:1px solid var(--line);border-radius:6px;background:var(--bg);padding:7px;text-align:center}
js
let a=0,b=0,phase=0;function tick(){const p=phase%4;if(p===0||p===1)a++;if(p===2)b++;document.getElementById('actorA').classList.toggle('on',p!==2);document.getElementById('actorB').classList.toggle('on',p===2);document.getElementById('countA').textContent=a;document.getElementById('countB').textContent=b;document.getElementById('storeA').textContent=a;document.getElementById('storeB').textContent=b;document.getElementById('actorState').textContent=p===3?'A restarted; SQLite restores '+a:'Actor '+(p===2?'B':'A')+' handles request';phase++}tick();setInterval(tick,900)

SQLite 기반 Durable Object는 식별자별 인스턴스에 실행과 저장 공간을 묶습니다. 같은 객체로 향하는 요청은 그 객체의 상태를 읽고 변경할 수 있으며 저장 데이터는 인스턴스 재시작 뒤에도 남습니다.

데모에서는 A와 B의 카운터가 별도로 증가하고 A를 재시작해도 저장된 값이 복구됩니다. 객체 간 조회가 많거나 전역 SQL 조인이 필요하면 별도 데이터 설계를 고려해야 합니다.

언제 쓰나

사용자·방·세션처럼 키별로 상태와 요청을 한곳에 모을 때 고려합니다.

페이지로 열기 ↗