액터는 직접 공유 상태를 수정하게 하지 않고 메시지를 주고받습니다. 각 액터는 받은 메시지를 처리하며 자신이 소유한 상태를 바꿉니다.
메시지 순서와 배달 실패 가능성은 여전히 설계해야 합니다. 한 액터에 작업이 몰리면 그 메시지함이 병목이 될 수 있으므로 액터 경계를 업무 단위에 맞춥니다.
언제 쓰나
공유 상태 경쟁을 줄이고 독립된 구성 요소 간 명령을 전달할 때 씁니다.
각 액터가 자기 상태와 메시지함을 소유하고 메시지를 차례로 처리합니다.
<div class="v"><header><b>ACTOR MAILBOX</b><span id="state"></span></header><main><div class="mail" id="mail"></div><div class="actor" id="actor"></div></main><footer>one mailbox, owned state</footer></div>.v{width:min(92vw,660px);height:min(86vh,310px);box-sizing:border-box;padding:clamp(9px,2.5vmin,18px);border:1px solid var(--line);border-radius:14px;background:var(--surface);display:flex;flex-direction:column;gap:7px;color:var(--fg);font:500 clamp(15px,3.2vmin,17px)/1.25 var(--font-sans, sans-serif)}.v header,.v footer{display:flex;justify-content:space-between;align-items:center;gap:8px;white-space:nowrap}.v header b{color:var(--accent);font-size:.9em}.v header span,.v footer{color:var(--muted);font-size:.82em}.v main{flex:1;min-height:0;position:relative;overflow:hidden}.v .mono{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.v .active{background:var(--accent)!important;color:var(--bg)!important;border-color:var(--accent)!important}.v .muted{opacity:.28} .mail{height:39%;display:flex;justify-content:center;align-items:center;gap:5px}.mail b{padding:7px;border:1px solid var(--line);border-radius:5px;font:600 .82em ui-monospace,monospace}.actor{height:50%;border:1px solid var(--accent);border-radius:8px;display:grid;place-items:center;text-align:center;color:var(--accent);font:600 .85em ui-monospace,monospace}let n=0;const msgs=["+1","+2","−1"];function draw(){document.getElementById("mail").innerHTML=msgs.slice(n).map((x,i)=>"<b class=\""+(i===0?"active":"")+"\">"+x+"</b>").join("");document.getElementById("actor").innerHTML="ACTOR STATE<br>count = "+[1,3,2][n];document.getElementById("state").textContent="handle "+msgs[n];n=(n+1)%3}draw();setInterval(draw,1050)액터는 직접 공유 상태를 수정하게 하지 않고 메시지를 주고받습니다. 각 액터는 받은 메시지를 처리하며 자신이 소유한 상태를 바꿉니다.
메시지 순서와 배달 실패 가능성은 여전히 설계해야 합니다. 한 액터에 작업이 몰리면 그 메시지함이 병목이 될 수 있으므로 액터 경계를 업무 단위에 맞춥니다.
공유 상태 경쟁을 줄이고 독립된 구성 요소 간 명령을 전달할 때 씁니다.