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·공유 상태 계층과 조합해야 합니다.
섹션별 상세
용어 해설
- 벌크헤드 패턴(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 없이는 공유하지 않습니다.
코드 예제
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()이 획득과 해제를 자동으로 처리하는 기본 사용 예시입니다.
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 토큰 보호 바닥을 할당하고 나머지 용량만 공유 영역으로 남기는 설정입니다.
const report = ctx!.reportUsage(
{ input: actualInput, output: cumulativeOutput },
{
remainingOutputTokens: Math.max(0, maxOutput - cumulativeOutput),
safetyMarginTokens: 128,
},
);스트리밍 중 누적 사용량을 보고해 이미 처리한 입력과 생성된 출력의 예약을 줄이고, 남은 출력량과 안전 여유분만 계속 점유하게 합니다.
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이 더 높은 완전한 한 덩어리의 제한 스냅샷만 적용해 동시성·대기열·토큰 예산을 원자적으로 갱신합니다.
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 Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.