/dev/null はすべての入力を即座に破棄するが、トランザクションの ACID 特性を完璧に満たすシステムとして風刺的に説明されている
- 原子性(Atomicity) の観点では、データは部分的に書き込まれず、すべて消えるか、まったく書き込まれないかのどちらかである
- 一貫性(Consistency) においては、常に空の状態を維持するため、システムの不変条件が破られない
- 分離性(Isolation) では、複数のプロセスが同時にアクセスしても互いに干渉せず、保存されないため衝突も発生しない
- 永続性(Durability) は、再起動後もなお「何もない」状態を維持する点で完璧であり、ただし 保存容量が 0 バイト であることだけがユーモラスに唯一の制約として挙げられている
/dev/null の ACID 特性分析
/dev/null は すべての入力を受け取って即座に破棄する特殊ファイルであり、Linux や Unix 系システムでよく使われるデータシンク(sink)の役割を果たす
- 筆者はこれを 「Web Scale」データベースになぞらえ、データベースの中核的な特性である ACID を風刺的に当てはめている
- その結果、
/dev/null は完璧に安定している一方で、データを一切保存しないという点で 極端な単純さを示している
Atomicity — 原子性
/dev/null にデータを書き込むと すべて消えるか、まったく記録されないかであり、部分書き込みは存在しない
- これはトランザクションの「すべてか無か(all or nothing)」という原則と同じ振る舞いである
- したがって
/dev/null は 部分的な失敗や不完全な状態遷移が発生しない、完全な原子性を保証する
Consistency — 一貫性
/dev/null は常に 空の状態を維持し、どのような入力もこの不変条件を壊さない
- データが書き込まれても即座に破棄されるため、システムは常に有効な状態へ遷移する
- 結果として、「ファイルには何もない」という 不変条件(invariant) が常に真のまま保たれる
Isolation — 分離性
- 複数のプロセスが同時に
/dev/null にデータを書き込んでも 衝突や干渉は発生しない
- 保存そのものが行われないため、トランザクション間の影響はまったくない
- これは 完全な並列処理環境でも一貫した結果を保証する、理想的な分離性の実装である
Durability — 永続性
/dev/null はデータを「永遠に何でもない状態へ」とコミットする
- システムがクラッシュしたり再起動したりしても、
/dev/null の状態は変わらない
- つまり、「無」の永続性を完璧に保証する形である
制約とユーモラスな結論
- 筆者は
/dev/null の唯一の問題として 「0 バイトの保存領域」 を挙げている
- より多くの容量が必要なら「エンタープライズ営業チーム(実質的には筆者本人)」に問い合わせてほしい、という冗談で締めくくられている
- これはデータベースの容量や性能をめぐる IT 業界の誇張されたマーケティング慣行を風刺する表現である
1件のコメント
Hacker Newsのコメント
過去のHNでの議論は こちら で見られる
fastjsonもあわせて紹介している(GitHubリンク)/dev/nullにし、バックエンドを nocode で構成することだ/dev/nullに移してから、ユーザー関連の問題は一度も起きていない/dev/nullがACIDを満たすというのは、DBの自明解のようなものだそれでもACIDのような概念が真空の中で存在するわけではないことを思い出させてくれる良い読み物だった(参考リンク)
/dev/nullの中なら例外かもしれない/dev/nullをこういう用途で使ったことがある出力先はどこかに必要だが、その先が耐えられるかどうかを気にしたくないときに使う
デプロイ段階では検証済みのストレージに差し替えればいい
/dev/nullはストレージ界のtrueコマンドのような存在だ/dev/nullとtrueだけはバグフリー上位に入ると思う/dev/nullは常に即時一貫性があり、常に利用可能で、完全なパーティション耐性を備えている無限ノードまでスケールしても完全なCAPを維持する唯一のDBだ
/dev/null0と/dev/null1を別々に運用している障害時には手動でシンボリックリンクを更新し、sarbox監査を通過しないと本番利用は禁止される
/devがマウントされていない状況を経験したことがないらしい/dev/nullは多くの学術的定義では serializable だが、厳密な直列化 (strict serializable) ではないすべての読み取りを時刻0で実行して空の結果を返し、書き込みは発生時点でそのまま捨てればよい
要点は リアルタイム保証 (real-time guarantee) を要求しなければならないということだ
/dev/nullシステムにはただ1つの状態しか存在しない/dev/nullがウェブスケールなのか気になる/dev/nullなら zombo.com のようなサイトも動かせるsupersimplestorageservice.com で見られ、
昔のHNでも何度も議論されたことがある(検索リンク)
/dev/nullは常に空だと言われるが、実際には **