Skip to content

バックプレッシャー・コントローラ

バックプレッシャー・コントローラは Commander ランタイムの 統合入場制御(admission control) です。需要が容量を超えたときの過負荷を防ぎ、Token Bucket → Ring Buffer → Circuit Breaker の 3 段パイプラインを使います。

構造

Producer → [Token Bucket] → [Ring Buffer] → [Circuit Breaker] → Consumer
               rate-limit       absorb bursts     protect when overwhelmed
役割パターン
Token Bucket秒あたりトークンで入場速度を制限Leaky bucket
Ring Bufferバースト吸収(固定サイズ、O(1))LMAX Disruptor
Circuit Breaker消費者過負荷時の保護Hystrix 3-state

動作

  1. Token Bucket — リクエストがトークンを消費。空なら ring buffer へ spill。
  2. Ring Buffer — 固定サイズでバーストを吸収。満杯なら最古を破棄(spill 集計)。
  3. Circuit Breaker — spill 率が閾値を超えると open、half-open まで drop。

設定

typescript
import { BackpressureController } from "@commander/core";

const controller = new BackpressureController({
  tokenBucket: {
    maxTokens: 100,
    refillRatePerSecond: 50,
  },
  ringBuffer: {
    capacity: 200,
  },
  circuitBreaker: {
    failureThreshold: 0.5,
    recoveryTimeoutMs: 30000,
    halfOpenMaxRequests: 10,
  },
});

パッケージは monorepo の packages/core から。npm 公開が主経路になるまでは workspace を使ってください。

使い方

typescript
const admission = controller.tryAdmit();

if (admission.allowed) {
  const result = await processRequest(request);
  controller.recordSuccess();
} else {
  return { status: 429, reason: admission.reason };
}

Lock-free

CAS ベースの原子カウンタで、同時読みが書きをブロックしません(NFR-PERF-05)。

メトリクス

メトリクス説明
backpressure_tokens_availableバケット残トークン
backpressure_ring_buffer_occupancyリング占有率
backpressure_circuit_breaker_stateCLOSED / OPEN / HALF_OPEN
backpressure_requests_admitted_total許可
backpressure_requests_rejected_total拒否
backpressure_requests_spilled_totalspill

チューニング

症状調整
429 が多すぎるmaxTokens / refillRatePerSecond を上げる
メモリ圧ring capacity を下げる
連鎖障害failureThreshold を下げ早期 open
回復が遅いrecoveryTimeoutMs を延ばす

関連

MIT — マルチエージェント編成のために。