작업 큐 우선순위와 공정성

Task queue priority and fairness

급한 작업을 앞세우면서 한 테넌트가 공유 워커를 독점하지 않게 합니다.

···
html
<div class="scene"><div class="title">SHARED WORKER DISPATCH</div><div class="switch" id="priority">PRIORITY ON</div><div class="dispatch"><div class="queueItems"><span>A standard</span><span id="urgent">B urgent</span><span>A standard</span></div><div class="worker">WORKER<br><b id="next">B urgent</b></div></div><div class="counts"><span id="countA">A served 0</span><span id="countB">B served 0</span></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)}}.switch{align-self:flex-start;border:1px solid var(--accent);border-radius:12px;padding:4px 9px;color:var(--accent);cursor:pointer}.dispatch{display:flex;align-items:center;gap:8px;flex:1}.queueItems{display:grid;gap:3px;flex:1}.queueItems span{border:1px solid var(--line);border-radius:5px;padding:3px}.queueItems #urgent{border-color:var(--accent-3)}.worker{flex:1;border:2px solid var(--accent);border-radius:8px;padding:10px 4px;text-align:center}.worker b{display:block;color:var(--accent)}.counts{display:flex;justify-content:space-between;gap:4px}.counts span{color:var(--muted)}
js
let priority=true,a=0,b=0,n=0;function tick(){const chooseB=priority?n%3!==2:n%2===1;if(chooseB)b++;else a++;document.getElementById('next').textContent=chooseB?'B urgent':'A standard';document.getElementById('countA').textContent='A served '+a;document.getElementById('countB').textContent='B served '+b;document.getElementById('priority').textContent=priority?'PRIORITY ON':'FAIRNESS VIEW';n++}tick();setInterval(tick,950);document.getElementById('priority').addEventListener('pointerdown',()=>{priority=!priority;tick()})

우선순위는 같은 큐에서 급한 작업을 먼저 꺼내고, 공정성은 테넌트별 작업 배분 비율을 조절합니다. Temporal은 2026년 작업 큐의 두 기능을 정식 제공했습니다. 두 규칙을 함께 쓰면 높은 우선순위 요청을 처리하면서도 작은 테넌트가 계속 밀리는 일을 줄일 수 있습니다.

데모는 우선순위 토글에 따라 워커가 다음에 받는 작업을 바꾸고 A·B의 처리 횟수를 보여줍니다. 낮은 우선순위 작업의 지연 상한과 테넌트별 서비스 수준을 별도로 측정해야 합니다.

언제 쓰나

여러 고객이 워커 풀을 공유하고 요청량과 긴급도가 다를 때 사용합니다.

페이지로 열기 ↗