非機能 (1) 可用性 ─ 利用者の SLO を背負う
ここから 4 章にわたって、共通基盤の 非機能要件 を扱う。ドメイン側出身者が違和感を覚える「非機能要件が桁外れに重い」の正体に正面から向き合う章群。
最初に 可用性 から入る。
共通基盤の SLO は 1 桁シビア
利用者ドメインの SLO 例:
| ドメイン | SLO の目安 |
|---|---|
| 内部管理画面 | 99% (年 87 時間 down) |
| 標準的な業務 SaaS | 99.9% (年 8.7 時間) |
| 金融・決済 | 99.95% (年 4.4 時間) |
| 重要インフラ | 99.99% (年 52 分) |
共通基盤の SLO は 利用者の SLO の和 に縛られる:
利用者 A の SLO: 99.9%
利用者 B の SLO: 99.9%
利用者 C の SLO: 99.9%
全員が認証基盤に依存
認証基盤の SLO ≥ 99.99%(少なくとも 1 桁上)
自分が止まると 100 個のサービスが止まる。だから利用者より 1 桁シビアな SLO を背負う。これが可用性で「桁が違う」と感じる正体。
graph TB
P[共通基盤<br/>SLO 99.99%]
P --> A[サービス A<br/>SLO 99.9%]
P --> B[サービス B<br/>SLO 99.9%]
P --> C[サービス C<br/>SLO 99.9%]
P --> D[サービス ...]
Note1[基盤の SLO は<br/>利用者全員の SLO の上限]
style P fill:#e1f5ff
style A fill:#fff4e1
style B fill:#fff4e1
style C fill:#fff4e1
SLI / SLO / Error Budget
Google SRE Book “Service Level Objectives” の用語を整理する。
SLI(Service Level Indicator)
計測する値。例:
- リクエストの success rate:
成功した req / 全 req - リクエストの latency p99:99% のリクエストが N ms 以下
- データの freshness:最新データの更新からの遅延
SLO(Service Level Objective)
SLI の目標値。例:
- success rate ≥ 99.99%
- latency p99 ≤ 100ms
- freshness ≤ 60s
Error Budget
1 - SLO。例:
- SLO 99.99% → error budget 0.01%(月 4.3 分の “止まっていい時間”)
- SLO 99.9% → error budget 0.1%(月 43 分)
graph LR
T[1ヶ月: 100%]
T --> S[SLO 達成 99.99%]
T --> E[Error Budget 0.01%<br/>= 月 4.3 分]
Note1[error budget が "予算"<br/>使い切ったら release 停止]
style S fill:#e1ffe1
style E fill:#fff4e1
Error Budget の運用
Google SRE “Error Budget Policy” が示す運用ルール:
Error budget が残っているなら release を続ける。尽きたら release を止めて信頼性向上に投資する。
graph TB
Q{Error budget 残量}
Q -->|健全 > 50%| Release[積極的 release]
Q -->|警戒 25-50%| CarefulRelease[慎重 release / 段階的]
Q -->|危険 < 25%| StopRelease[release 停止 / 改善優先]
Q -->|尽きた 0%| Freeze[完全停止 / 緊急対応]
style Release fill:#e1ffe1
style CarefulRelease fill:#fff4e1
style StopRelease fill:#ffe1e1
style Freeze fill:#ffd1d1
これは 政治闘争を避けるための仕組み。「release したい開発側」と「安定を求める運用側」の対立を、数値で自動判定する。
共通基盤の SLI 設計
利用者ドメインなら「画面の表示が速いか」で SLI が決まる。共通基盤は:
認証基盤の SLI 例
| SLI | 説明 | 目標 SLO |
|---|---|---|
| Token issuance success rate | トークン発行成功率 | 99.99% |
| Token validation latency p99 | トークン検証 p99 latency | ≤ 50ms |
| Token validation availability | トークン検証可用性 | 99.999% |
| OIDC discovery latency p99 | discovery endpoint p99 | ≤ 200ms |
ホットパス(毎リクエスト走る)の SLO は最も厳しい。Token validation は基本毎 API call で走るので、5 9(99.999%、月 26 秒)レベルが要求される。
通知基盤の SLI 例
| SLI | 説明 | 目標 SLO |
|---|---|---|
| Send accept rate | 送信受付成功率 | 99.99% |
| End-to-end delivery rate | 実配信成功率(24h) | 99.5% |
| Delivery latency p95 | 配信完了 p95 | ≤ 60s |
| Bounce rate | 跳ね返り率 | ≤ 5% |
配信は eventually で OK(数秒の遅延許容)だが、送信受付は同期的に成功 / 失敗が返る 必要がある。SLO の階層を分ける。
直列依存と並列依存
依存関係で SLO の見積もりが変わる。
直列依存
利用者 → 認証基盤 → DB
利用者の SLO = 認証基盤 SLO × DB SLO
99.99% × 99.99% = 99.98%
直列なら 掛け算。依存先の SLO を超えられない。
並列依存(fallback あり)
利用者 → Cache(primary)
↘ DB(fallback)
両方落ちないと利用者は失敗
SLO = 1 - (1 - cache SLO) × (1 - DB SLO)
1 - 0.001 × 0.0001 = 99.9999%
並列+ fallback なら 足し算的に上がる。だが complexity が増える。
Multi-region の可用性
graph TB
subgraph "Region A"
A1[Service A]
A2[Service A replica]
end
subgraph "Region B"
B1[Service A]
B2[Service A replica]
end
Client --> LB[Global LB]
LB --> A1
LB --> B1
A1 -. Replication .- B1
Note1[Region 1 つ落ちても<br/>もう一つで継続]
style LB fill:#e1f5ff
5 9 レベルの SLO は Multi-region 必須。だがコストが跳ね上がる:
- インフラコスト 2 倍以上
- データ整合性の問題(NewSQL or eventual)
- 障害時の判断(split-brain 対策)
「SLO を 1 桁上げる」決定は、コストを倍増させる決定でもある。
SLO とコストのトレードオフ
SLO 99.9% → 月 43 分 down OK / 単一 region で OK / コスト 1x
SLO 99.99% → 月 4.3 分 / Multi-AZ + 良い運用 / コスト 2x
SLO 99.999% → 月 26 秒 / Multi-region + 完璧 / コスト 5-10x
5 9 を求めるなら 5-10 倍のコストを払う覚悟。安易に約束しない。
信頼性は無限にできるわけではない。100% の可用性は誤った目標で、しかも到達不能。
「99.9% で十分」を見極める力が、共通基盤チームの腕の見せどころ。
SLO は時間と共に進化する
最初から完璧な SLO を決められない。運用しながら測って学ぶ:
graph LR
V0[v0: SLO 仮置き 99.9%]
V1[v1: 1 ヶ月実測]
V2[v2: 利用者と合意した SLO]
V3[v3: 階層化された SLI/SLO]
V0 --> V1 --> V2 --> V3
style V0 fill:#e1ffe1
style V3 fill:#fff4e1
利用者の苦情と、実測値の両方を見て、段階的に厳しくしていく。最初から 5 9 を約束しない。
この章の要点
- 共通基盤の SLO は 利用者の SLO の和 に縛られる、1 桁シビア
- SLI(計測値)/ SLO(目標値)/ Error Budget(1 - SLO)
- Error Budget は release 速度の自動判定機能
- 共通基盤の SLI は ホットパス(毎リクエスト走るもの)が最厳格
- 直列依存は SLO 掛け算、並列+fallback は足し算的
- 5 9 は Multi-region 必須、コスト 5-10 倍
- SLO は段階的に進化、最初から完璧を目指さない
次章への問いかけ
99.99% を背負う立場を理解した。だが捌くべきトラフィックも違う。
利用者全員のリクエストが集まってくる立場で、性能をどう設計するか。次章で 非機能要件 (2) 性能 ── 集約トラフィック、Backpressure、N+1 問題。