ステートマシン(状態機械)入門¶
原文¶
A state machine is a model where computation is expressed as a set of discrete states and deterministic transitions between them. At any point in time, the system is in exactly one state. All...
この記事では以下について話します: - 状態機械の重要性 - HTTPサーバーとしての状態機械 - それらを設計するためのベストプラクティス - すべてが別の状態である方法 - メンタルモデル
要約¶
ステートマシン(有限状態機械)とは、「離散的な状態の集合」と「状態間の遷移」でシステムの振る舞いを記述するモデル。任意の時点でシステムは必ず1つの状態にある。HTTPサーバー、注文フロー、接続管理など、実用システムの多くがステートマシンとして表現できる。
解説¶
ステートマシンの基本要素¶
| 要素 | 説明 |
|---|---|
| 状態 (State) | システムが取り得る離散的な条件(例: IDLE, RUNNING, ERROR) |
| 遷移 (Transition) | ある状態から別の状態への変化 |
| イベント/トリガー | 遷移を引き起こす入力 |
| 初期状態 | システム起動時の状態 |
| 終了状態 | 処理が完了した状態 |
HTTPサーバーをステートマシンで考える¶
IDLE → [リクエスト受信] → READING_REQUEST
READING_REQUEST → [ヘッダー解析完了] → PROCESSING
PROCESSING → [レスポンス生成] → SENDING_RESPONSE
SENDING_RESPONSE → [送信完了] → IDLE
SENDING_RESPONSE → [エラー] → ERROR
実用例¶
| システム | 状態の例 |
|---|---|
| 注文管理 | 未払い → 支払い済み → 発送済み → 受取完了 → キャンセル |
| TCP接続 | CLOSED → SYN_SENT → ESTABLISHED → FIN_WAIT → CLOSED |
| ユーザー認証 | 未認証 → 認証中 → 認証済み → セッション失効 |
| バックグラウンドジョブ | PENDING → RUNNING → COMPLETED / FAILED / RETRYING |
ベストプラクティス¶
- 明示的に状態を定義する: 暗黙の状態(フラグの組み合わせ等)はバグの温床
- 不正な状態遷移をガードする: 「COMPLETED → RUNNING」のような遷移を型/コードで禁止
- 状態図を先に書く: コードの前に図を描くと設計の抜け漏れが見える
- Goでの実装例:
type State int+const (IDLE State = iota; RUNNING; ...)+ switch文
→ 関連: データ不整合10パターン、バッチ処理解説