벌크헤드 격리

Bulkhead isolation

요청 풀을 나눠 한 기능의 포화가 다른 기능으로 번지지 않게 합니다.

···
html
<div class="scene"><div class="title">SEPARATE CAPACITY POOLS</div><div class="poolrow"><div class="pool"><b>POOL A</b><div class="slots" id="slotsA"></div><span id="statusA">busy</span></div><div class="wall"></div><div class="pool"><b>POOL B</b><div class="slots" id="slotsB"></div><span id="statusB">available</span></div></div><div class="muted" id="bulkState">A fills; B keeps serving</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)}}.poolrow{display:flex;gap:7px;flex:1;min-height:0}.pool{flex:1;border:1px solid var(--line);border-radius:8px;padding:7px;text-align:center;display:flex;flex-direction:column;justify-content:space-between}.pool b{color:var(--accent)}.slots{display:flex;gap:4px;justify-content:center}.slots i{width:23%;height:clamp(18px,6vmin,38px);border:1px solid var(--line);border-radius:5px;background:var(--bg)}.slots i.used{background:var(--accent)}.slots i.rejected{background:var(--accent-3)}.wall{width:5px;background:var(--line);border-radius:4px}
js
let n=0;function tick(){const full=n%3===1;document.getElementById('slotsA').innerHTML='<i class=used></i>'.repeat(full?3:2)+(full?'<i class=rejected></i>':'<i></i>');document.getElementById('slotsB').innerHTML='<i class=used></i><i></i><i></i>';document.getElementById('statusA').textContent=full?'request rejected':'2 / 3 busy';document.getElementById('statusB').textContent='request accepted';document.getElementById('bulkState').textContent=full?'A saturated; B still accepts':'Capacity is isolated';n++}tick();setInterval(tick,1050);document.querySelector('.scene').addEventListener('pointerdown',tick)

벌크헤드는 선박의 격벽처럼 작업별 동시 실행 슬롯을 나눕니다. 느린 외부 호출이 한 풀을 채워도 다른 풀은 자기 슬롯으로 계속 처리할 수 있습니다. 공유 스레드나 연결 풀을 무제한으로 쓰면 한 의존성의 지연이 전체 장애가 될 수 있습니다.

데모는 A 풀이 꽉 차도 B 요청은 통과하는 모습을 보여줍니다. 풀을 너무 작게 잡으면 정상적인 급증도 거절하므로 실제 부하로 한도를 조정해야 합니다.

언제 쓰나

서로 다른 외부 서비스나 테넌트가 한 실행 풀을 두고 경쟁할 때 사용합니다.

페이지로 열기 ↗