マルチテナンシー ─ Hot tenant 対策と Quota
共通基盤の多くは マルチテナント。1 つのインスタンスが多数の tenant を抱える。1 tenant の異常な使い方が他 tenant に波及する のを防ぐのが、この章の主題。
前作 DB 設計の軸 2026 ch16 で 判断 4:Hot Tenant 対策 を扱った。本章ではこれを基盤全体に拡張する。
Noisy Neighbor 問題
Microsoft Azure Architecture Center “Noisy Neighbor antipattern” が定義:
1 tenant の重い workload(大量 import、複雑 query、batch 処理)が 共有の CPU / メモリ / I/O を不釣り合いに消費し、同じインフラ上の他 tenant の性能を劣化させる。
graph TB
subgraph "Shared Infra"
R[CPU / Memory / I/O]
end
T1[Tenant A: 通常使用] --> R
T2[Tenant B: 通常使用] --> R
T3[Tenant C: 暴走 90% を消費] --> R
R -. 残り 10% で A B が苦しむ .-> T1
R -. 残り 10% で A B が苦しむ .-> T2
style T3 fill:#ffe1e1
これを防ぐのが Tenant Isolation の役割。
2026 年の Isolation 技術トレンド
Kubernetes が標準
ほぼ全ての SaaS が Kubernetes で動いている。Tenant Isolation の道具:
- Namespace: tenant ごと
- ResourceQuota: tenant の resource 上限
- NetworkPolicy: tenant 間の通信制御
- PodDisruptionBudget: tenant 別の availability
Hardened Container Runtime(2026 年トレンド)
伝統的な container は 同じ kernel を共有しているため、kernel exploit で全 tenant に影響しうる。これを解決するのが Hardened runtime:
| Runtime | 仕組み |
|---|---|
| Kata Containers | 軽量 VM で各 container をラップ、独立 kernel |
| Edera Runtime | 2026 年に台頭、より軽量な VM-based isolation |
| gVisor | user-space kernel で system call を中継 |
| Firecracker | AWS Lambda が使う micro-VM |
2026 年の傾向:「container は便利だが kernel 共有が怖い」と認識され、multi-tenant SaaS は hardened runtime に移行中。
Memory が CPU より noisy
2025 WJARR study(前章のリサーチで触れた):
Memory-intensive workload は CPU-bound workload より tenant 間干渉を引き起こす。
理由:
- Memory bandwidth は共有(CPU はコア分離可)
- Cache の汚染(1 tenant が L3 cache を埋めると他 tenant が遅くなる)
- NUMA(メモリのトポロジーが性能に直結)
CPU 制限だけでなく、Memory bandwidth / cache も意識した設計が要る。
4 段階の Isolation 戦略
graph TB
L1[L1: 論理分離<br/>Row-level filtering / tenant_id]
L2[L2: Schema 分離<br/>Schema-per-tenant]
L3[L3: DB / コンテナ分離<br/>DB-per-tenant / Pod-per-tenant]
L4[L4: 物理分離<br/>Cluster-per-tenant / VM-per-tenant]
L1 --> L2 --> L3 --> L4
Note1[下に行くほど分離強い、コスト高]
style L1 fill:#fff4e1
style L4 fill:#ffe1e1
戦略の選び方
| Tier | 推奨分離 | コスト |
|---|---|---|
| Free | L1(論理) | 最安 |
| Pro | L1-L2 | 低 |
| Enterprise | L2-L3 | 中 |
| Critical(金融・規制) | L3-L4 | 高 |
ティア別に分離度を変える のが現実的。Stripe / GitHub / Slack は基本 L1-L2、Enterprise だけ L3。
Quota と Rate Limit
Isolation の 行動制限 側として Quota と Rate Limit。
Quota(累積上限)
# Tenant の上限
storage_bytes: 10_000_000_000 # 10GB
api_calls_per_month: 1_000_000
concurrent_connections: 100
累積で超えるとエラー にする。Free tier の上限を作ったり、課金プランの境界に使う。
Rate Limit(時間あたり上限)
// Token Bucket(Redis で実装)
async function checkRateLimit(tenantId: string, capacity: number, refillRate: number) {
const key = `rl:${tenantId}`;
// ... bucket logic
if (tokens < 1) {
return { allowed: false, retry_after: timeUntilRefill };
}
return { allowed: true };
}
急激な burst を吸収 + 持続的な過負荷を抑える。
Tier 別の Limit
free_tier:
rate_limit: 60/min
burst: 100
pro_tier:
rate_limit: 600/min
burst: 1000
enterprise:
rate_limit: unlimited
burst: 10000
Limit 超過時の挙動
HTTP/1.1 429 Too Many Requests
Retry-After: 30
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1715234430
利用者が どれくらい待てばいいか 機械可読で伝える。
Hot Tenant の早期検知
Per-tenant の Metrics
// 各 tenant の使用量を観測
const counter = meter.createCounter('platform_requests', {
attributes: { tenant_id: tenantId }
});
ダッシュボードで 使用量 top 10 tenant を表示し、異常を早期検知する:
Tenant A: 50,000 req/min ← 突如急増
Tenant B: 10,000 req/min
...
異常 → 自動アラート → 手動 / 自動で intervene。
Auto-scaling vs Throttling
異常な tenant を発見したら:
| 対応 | いつ |
|---|---|
| Auto-scale | 全体の負荷増、tenant 全員が忙しい |
| Throttle | 1 tenant が異常、他に影響を与えている |
| Quarantine | 攻撃が疑われる tenant を隔離 |
すべてが auto-scale で解決するわけではない。特定 tenant の throttling が選択肢として必要。
Per-tenant の専用 worker
優先度が高い tenant には 専用 worker を割り当てる:
# Enterprise tenant 用
enterprise_worker_pool:
size: 50
tenants: [t-001, t-002, ...]
# 共有 worker pool
shared_worker_pool:
size: 200
tenants: <all others>
Bulkhead パターンの組織化。SLA を保証したい tenant を物理的に隔離する。
Tenant の “重み” を調整する
すべての tenant が等価ではない。重み付け で公平性を担保:
// 課金プランで weight を分ける
const weights = {
free: 1,
pro: 10,
enterprise: 100,
};
// 重みに比例して resource を割り当て
const cpuShare = baseCpu * weights[tenant.plan];
K8s の request / limit がこれを実装。
Multi-tenant の Trade-off
graph TB
Cost[コスト効率]
Isolation[Isolation の強さ]
Cost <-->|Trade-off| Isolation
Note1[完全 isolation = コスト 10x<br/>完全共有 = noisy neighbor リスク]
style Cost fill:#e1f5ff
style Isolation fill:#fff4e1
ティア / プランで使い分ける。全 tenant に最強 isolation を提供しない。
マルチテナンシーのチェックリスト
graph TB
Q1[Isolation tier 戦略] --> Q2[Quota 設定]
Q2 --> Q3[Rate Limit per tier]
Q3 --> Q4[Per-tenant Metrics]
Q4 --> Q5[Hot tenant 検知 + 対応]
Q5 --> Q6[Bulkhead で組織化]
Q6 --> OK[多 tenant の安定運用]
style OK fill:#e1ffe1
この章の要点
- Noisy Neighbor 問題:1 tenant の workload が他 tenant の性能を劣化
- 2026 トレンド:Hardened runtime(Kata, Edera)への移行、memory bandwidth 重視
- Isolation 戦略 4 段階:論理 / Schema / DB / 物理。tier で使い分け
- Quota(累積)+ Rate Limit(時間)の組み合わせ
- 429 レスポンスは
Retry-After等で機械可読 - Hot tenant 検知は per-tenant metrics、対応は throttle / quarantine / scale
- Enterprise tier は専用 worker pool で Bulkhead
次章への問いかけ
ここまでは「いま動かす」の話。基盤は 進化 しなければならない。
次章で進化と保守 ── Versioning、Deprecation、Migration の作法。