본문으로 건너뛰기

LLM 호출 전 부하를 차단하는 비동기 벌크헤드

async-bulkhead-llm은 LLM 호출 전 동시성·토큰 예산을 검사해 과부하 요청을 즉시 차단합니다.

이 요약은 AI가 원문을 분석해 생성했습니다. 정확한 내용은 원문 기준으로 확인하세요.

TL;DR

async-bulkhead-llm은 LLM Provider 호출 전에 동시성, 대기열, 추정 토큰 예산을 검사해 한도를 넘는 요청을 fail-fast로 차단하는 Node.js 라이브러리입니다. 모델별 입력 토큰 추정, 실제 사용량 환불, 스트리밍 중 progressive reconciliation, 우선순위 reserve와 고정 admission class를 통해 단일 프로세스 안에서 용량을 세밀하게 관리합니다. revision 기반 원자적 제한 갱신과 admission provenance는 gateway나 control plane이 재구성 경쟁 상황을 추적하도록 하며, observe 모드는 정책을 강제하기 전 우회 실행 결과를 별도로 측정합니다. retries, provider SDK, cost accounting, distributed coordination은 범위 밖이므로 상위 orchestration·공유 상태 계층과 조합해야 합니다.

섹션별 상세

async-bulkhead-llm은 LangChain이나 LlamaIndex처럼 LLM 파이프라인을 조합하는 도구가 아니라 Provider 호출 직전 실행 여부를 결정하는 단일 프로세스 admission-control 라이브러리입니다. 요청이 들어오면 동시 실행 수, 선택적 대기열, 추정 입력 토큰과 최대 출력 토큰, 우선순위 reserve를 함께 검사하고 한도를 넘으면 기본적으로 즉시 거부합니다. 따라서 재시도나 fallback보다 먼저 과부하 유입을 줄이고, 비용 회계나 분산 rate limiting은 별도 계층에 맡기는 경계형 보호 장치로 자리 잡습니다.
v3.10부터 applyLimits()는 maxConcurrent, maxQueue, token budget과 high-priority reserve를 strictly increasing revision이 붙은 완전한 스냅샷으로 함께 교체합니다. 낮은 revision은 상태를 바꾸지 않고, 더 높은 스냅샷의 검증이 실패하면 기존 제한을 유지하며, 한도를 줄일 때도 이미 실행 중인 작업이나 승인된 대기 요청을 취소하지 않고 완료에 따른 attrition으로 새 수용량을 회복합니다. v3.11은 이 결정 revision을 acquire 결과, token, run context, usage와 release 이벤트에 보존해 재구성 경쟁 상황에서도 어떤 제한 아래 승인됐는지 추적하게 합니다.
v3.14의 admissionClasses는 고정된 소수의 정책 버킷마다 hard concurrency와 in-flight token ceiling을 두고 전역 한도와 함께 검사합니다. v3.15에서는 각 클래스에 protectedConcurrent와 protectedInFlightTokens를 설정해 premium과 standard가 자기 몫의 최소 용량을 보장받도록 하며, 보호 바닥을 뺀 나머지만 공유하고 유휴 바닥을 다른 클래스에 자동 대여하지 않습니다. 클래스 ID는 생성 시 고정되어 알 수 없는 값이 오류를 내므로 인증된 tenant나 application을 gateway에서 제한된 정책 클래스에 매핑해야 합니다.
토큰 예산은 기본적으로 모델별 character-to-token 비율로 입력을 추정하고 max_tokens를 출력 상한으로 예약한 뒤, 완료 시 실제 input·output 사용량을 받아 미사용분을 환불합니다. 스트리밍에서는 reportUsage()가 누적 사용량을 기준으로 처리된 입력과 생성된 출력의 점유를 점진적으로 줄이며, v3.8의 adaptive estimator는 모델별 실제 입력량과 추정량의 EWMA 보정값을 minSamples 이후 적용합니다. multimodal 요청에서는 text block만 기본 계산하고 opaque block은 무시하거나 설정된 opaqueBlockTokens만큼 예약하므로 정확한 미디어 비용은 caller가 extraInputTokens 또는 custom estimator로 반영해야 합니다.
observe 모드는 budget_limit, concurrency_limit, queue_limit, timeout 같은 용량 거부를 실제 실패로 만들지 않고 callback을 실행하면서 bypass와 capacity snapshot을 별도 telemetry로 남깁니다. 반면 shutdown, caller cancellation, 안전하지 않은 dedup fan-out은 계속 hard failure이며, observed 작업은 bulkhead 용량을 점유하지 않아 포화 상태의 상시 운영 모드가 아니라 정책 보정과 rollout 검증에 적합합니다. run()의 in-flight deduplication은 전체 request 객체를 안정적으로 해시해 동일 호출을 합치지만, tenant 격리에는 dedupScope가 필요하고 단일 소비 스트림은 shareResult fan-out이나 per-call dedup:false 없이는 follower에게 공유하지 않습니다.

용어 해설

벌크헤드 패턴(Bulkhead Pattern)
서비스 자원을 격리된 용량 구획으로 나누어 한 영역의 과부하가 전체 시스템으로 번지지 않게 하는 장애 격리 방식입니다. 이 라이브러리는 LLM 호출 앞단에서 동시 실행 수와 대기열, 토큰 점유량을 제한해 포화 연쇄를 차단합니다.
백프레셔(Backpressure)
처리 용량보다 빠르게 유입되는 요청의 흐름을 제한하는 제어 방식입니다. async-bulkhead-llm은 요청을 무제한으로 쌓는 대신 동시성·대기열·토큰 한도를 기준으로 새 작업을 즉시 거부하거나 제한된 범위에서만 대기시킵니다.
어드미션 제어(Admission Control)
작업을 실행하기 전에 현재 용량과 정책을 검사해 실행 여부를 결정하는 관문입니다. 이 패키지는 Provider 호출 전에 입력 토큰과 최대 출력 토큰을 예약하고, 전역 및 admission class 한도를 함께 확인합니다.
토큰 예산(Token Budget)
동시에 실행 중인 LLM 요청이 점유할 수 있는 추정 토큰 총량의 상한입니다. 요청 전 입력 토큰과 max_tokens를 예약하고, 실제 사용량을 보고받으면 남은 예약을 환불하거나 출력 초과분을 반영해 새 요청의 수용 여력을 조정합니다.
실행 중 요청 중복 제거(In-flight Deduplication)
동일한 요청이 동시에 들어올 때 하나의 LLM 호출 결과를 여러 호출자가 공유하도록 하는 방식입니다. 기본적으로 전체 request 객체를 안정적으로 직렬화해 SHA-256 키를 만들며, tenant 격리에는 dedupScope를 사용하고 단일 소비 스트림은 별도 fan-out 없이는 공유하지 않습니다.

코드 예제

typescript
import { createLLMBulkhead } from 'async-bulkhead-llm';
const bulkhead = createLLMBulkhead({
model: 'claude-sonnet-4',
maxConcurrent: 10,
});
const request = {
messages: [{ role: 'user', content: 'Summarise this document...' }],
max_tokens: 1024,
};
const result = await bulkhead.run(request, async () => {
return callYourLLMProvider(request);
});

claude-sonnet-4 호출을 최대 10개까지 허용하고 bulkhead.run()이 획득과 해제를 자동으로 처리하는 기본 사용 예시입니다.

typescript
const bulkhead = createLLMBulkhead({
model: "gpt-4o",
maxConcurrent: 12,
tokenBudget: { budget: 24_000 },
admissionClasses: {
defaultClass: "standard",
classes: {
premium: {
protectedConcurrent: 6,
maxConcurrent: 10,
protectedInFlightTokens: 12_000,
maxInFlightTokens: 20_000,
},
standard: {
protectedConcurrent: 2,
maxConcurrent: 6,
protectedInFlightTokens: 4_000,
maxInFlightTokens: 10_000,
},
},
},
});

premium과 standard에 동시성 및 in-flight 토큰 보호 바닥을 할당하고 나머지 용량만 공유 영역으로 남기는 설정입니다.

typescript
const report = ctx!.reportUsage(
{ input: actualInput, output: cumulativeOutput },
{
remainingOutputTokens: Math.max(0, maxOutput - cumulativeOutput),
safetyMarginTokens: 128,
},
);

스트리밍 중 누적 사용량을 보고해 이미 처리한 입력과 생성된 출력의 예약을 줄이고, 남은 출력량과 안전 여유분만 계속 점유하게 합니다.

typescript
const result = bulkhead.applyLimits({
revision: 42,
maxConcurrent: 12,
maxQueue: 0,
tokenBudget: {
budget: 120_000,
highPriorityReserve: 20_000,
},
});
if (!result.applied) {
// Equal and lower revisions are ignored without mutation.
console.log(result.reason); // "stale_revision"
}

revision이 더 높은 완전한 한 덩어리의 제한 스냅샷만 적용해 동시성·대기열·토큰 예산을 원자적으로 갱신합니다.

typescript
const result = await bulkhead.run(
request,
async (signal, ctx) => {
logger.info({
admissionId: ctx?.admissionId,
admission: ctx?.admission, // "admitted" | "bypassed"
bypassReason: ctx?.bypassReason, // set only for bypassed work
bypassDetail: ctx?.bypassDetail, // capacity snapshot, when available
});
return callYourLLMProvider(request, {
signal,
onUsage: (usage) => ctx?.reportUsage(usage),
});
},
{ mode: "observe" },
);

observe 모드에서 수용 거부될 요청도 실제 호출을 진행하되 용량을 점유하지 않고 bypass 전용 telemetry로 기록합니다.

근거 모음

근거
  • async-bulkhead-llm은 Provider 호출 전에 동시성·토큰 예산·fail-fast admission을 적용한다. README의 Features와 Key differentiator 절에서 요청 fan-out 및 Provider rate limit 도달 전에 제한을 검사한다고 명시합니다.
  • v3.10의 applyLimits()는 revision이 증가하는 완전한 제한 스냅샷을 원자적으로 적용한다. What's New in v3.10 및 Atomic Runtime Reconfiguration 절의 Atomic updates, stale-update protection, shrink by attrition 설명입니다.
  • v3.15의 보호 admission-class floor는 소유 클래스에만 보장되며 유휴 용량을 자동으로 다른 클래스에 빌려주지 않는다. What's New in v3.15 절의 premium·standard 예시와 Floors are strict reservations 설명입니다.
  • 실제 사용량 보고 시 토큰 예약의 미사용분을 환불하고 스트리밍 중 점유량을 점진적으로 줄일 수 있다. Token Refund, Streaming budget enforcement, What's New in v3.13의 reportUsage()와 progressive hold 설명입니다.
  • observe 모드는 일부 용량 거부를 우회 실행하지만 용량 보호 없이 실행된 작업을 별도 telemetry로 분리한다. What's New in v3.9의 shadowReasons, bypass 이벤트, stats().observe 항목입니다.
  • in-flight deduplication은 전체 request를 기준으로 중복 호출을 합치며 단일 소비 스트림은 별도 fan-out 없이는 공유하지 않는다. Deduplication 및 Streaming results v3.5 절의 SHA-256 키, dedupScope, unshareable_result, shareResult 설명입니다.

기술

  • async-bulkhead-llm
  • async-bulkhead-ts
  • Node.js 20+
  • TypeScript
  • ESM
  • CommonJS
  • LangChain
  • LlamaIndex
  • OpenAI SDK
  • p-limit
  • Bottleneck
  • cockatiel
  • polly
  • Redis
  • Tiktoken
  • SHA-256
  • AbortSignal

활용 사례

  • LLM gateway의 동시 호출 수와 토큰 예산 제한
  • interactive 요청과 batch 요청의 우선순위 분리
  • premium·standard 등 고정 정책 클래스별 용량 보호
  • 스트리밍 응답의 누적 토큰 사용량 조정
  • control plane과 연동한 원자적 runtime reconfiguration
  • observe 모드를 이용한 admission 정책 rollout 검증
  • 동일한 비스트리밍 요청의 in-flight 중복 제거
  • SIGTERM 시 close()와 drain()을 이용한 graceful shutdown

언급된 리소스

AI 분석 전체 내용 보기

AI 요약 · 북마크 · 개인 피드 설정 — 무료

출처 · 인용 안내

원문 발행 2026. 08. 13.수집 2026. 08. 13.출처 타입 RSS

인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.