「信頼できるworld = 全リソースの同期GET」という等式をほどく
IaCのコンパイルは二引数plan(source, world)である。このうちworldの取得が遅い。信頼できるworldを作ろうとすると全リソースをクラウドAPIへの同期GETで読む(refresh)ことになり、所要時間はリソース総数に比例し、レート制限にも当たる。
しかしこの遅さは「信頼性 = 全リソースの同期GET」という等式を無条件に受け入れた結果である。等式をほどくと、攻め口は三つに分かれる。
- 読む量を減らす — 変わったものだけ読む
- 読む時刻をずらす — planの同期パスから外す
- 読まなくてよい条件を作る — 自分しか書かないなら自分の記録が真
三つはそれぞれ別分野に対応物を持つ。1と2はハードウェア/OSのdirty bitと無効化通知(CPUはメモリの全走査をしない)、およびデータベースの増分ビュー維持に対応する。3は分散システムのリース — 期限付きの所有権があるあいだは再確認なしで自分のキャッシュを信じてよい — と、型システムの所有権に対応する。
重要なのは、この三つが排他ではなく重ねられることである。既定は所有権で読まずに済ませ、共有リソースだけをイベント駆動のdirty追跡でカバーし、最終的な正しさはapply直前の検証で担保する、という層構造に落ちる。