知識マップ: ファイル連携の排他制御の基礎知識 - ファイルロックと原子的 claim のベストプラクティス

記事「ファイル連携の排他制御の基礎知識 - ファイルロックと原子的 claim のベストプラクティス」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

この記事は、共有フォルダや夜間バッチでのファイル連携を、OSロック任せではなく受け渡しプロトコルとして設計する考え方を整理する。読む前に処理権を原子的claimで確保し、生成中のファイルはtemp名に閉じ込めてcloseしたあとfinal名へrenameして公開し、完了はサイズやタイムスタンプで推測せずdone・manifestで明示する。lock fileを使うならownerIdやexpiresAtを持つlease形式にしてstale lockに備え、Windowsのbyte-range lockがメモリマップファイルでは無視されることやadvisory lockが約束を無視する相手には効かないことを踏まえたうえで、最後は同じ入力を再処理しても壊れないidempotencyで受け止める設計が実務では強いと結論づける。

ファイル連携の排他制御の知識マップ受け渡しプロトコルが原子的claim・temp->rename公開・done/manifest・lease化したlock file・idempotencyをどう組み合わせ、二重処理や書き込み途中の読み込みなどの事故をどのアンチパターンに対応させて防ぐかを示す図利用する利用する利用する利用する利用する利用する利用する防止する原因になり得る推奨される対応推奨される対応原因になり得る防止する原因になり得る推奨される対応原因になり得る推奨される対応推奨される対応前提とする利用する軽減する用いるのは非推奨用いるのは非推奨両立しない原因になり得る原因になり得る推奨される対応推奨される対応原因になり得る受け渡しプロトコル原子的claimtemp -> close -> rename/replaceでの公開done/manifestファイルlease化したlock fileidempotency(冪等性)を前提にした処理OSファイルロック(OSロック)原子的作成(CreateNew / O_CREAT|O_EXCL)二重処理(二重計上・二重送信・更新の消失)Exists->Createの二段階チェック最終ファイル名への直接書き込み書き込み途中ファイルの読み込み事故ファイルサイズ安定待ちによる完了判定共有ファイルの相互更新アンチパターンstale lockbyte-range lock(範囲ロック)異種システム連携advisory lockクロスボリュームのrenameフォールバック(コピー+削除)共有フォルダ(SMB)越しのファイル連携renameが開いているだけで失敗するファイルタイムスタンプの不確実性定期的なディレクトリ列挙変更通知の取りこぼし

概念間の関係(全29件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

受け渡しプロトコル
ファイル連携において、いつ読んでよいか・誰が処理権を持つか・失敗時にどう回復するかを明示的に設計する取り決め。OSロックだけに頼らず、temp->rename公開・原子的claim・done/manifest・lease化したlock file・idempotencyを組み合わせて構成する。
原子的claim
複数ワーカーが同じ入力ファイルを同時に処理しないよう、処理権の確保を1操作で行うこと。incomingからprocessing/<worker>/へのrenameのほか、FileMode.CreateNewやO_CREAT|O_EXCLによる原子的なファイル作成でも実現できる。
temp -> close -> rename/replaceでの公開
生成中のファイルをtemp名に閉じ込め、closeしたあとで同一ディレクトリ・同一ボリューム上のfinal名へrename/replaceする、書き込み途中のファイルを読ませないための公開パターン。
Exists->Createの二段階チェック
ファイルの有無を確認してから作成する、確認と確保が別操作になった実装。間に他プロセスが割り込めるため排他にならない。
原子的作成(CreateNew / O_CREAT|O_EXCL)
「無ければ作る」を1操作で行うファイル作成方法。.NETのFileMode.CreateNew系やPOSIXのO_CREAT | O_EXCLで実現し、確認と確保が分離した二段階チェックの隙間を無くす。
最終ファイル名への直接書き込み
受信側が「その名前が見えたら読んでよい」と解釈しているのに、送信側が最終ファイル名に直接書き始めてしまう実装。書き込み途中の内容がそのまま見えてしまう。
ファイルサイズ安定待ちによる完了判定
ファイルサイズが一定時間変化しないことをもって転送完了とみなす判定方法。ネットワーク越しのコピーの一時停止などで容易に誤判定する。
done/manifestファイル
本体ファイルとは別に、ファイル名・サイズ・ハッシュ・レコード数・idempotency keyなどを記録し、受信側が完全性を検証するための説明ファイル。doneファイルはその最小版。
共有ファイルの相互更新アンチパターン
1つのstatus.csvやcounter.jsonを複数プロセスが読み書きして状態を共有しようとする設計。読み取り後の更新がタイミングによって互いに上書きされ、後に書いた側で先の更新が消える。
idempotency(冪等性)を前提にした処理
同じ入力をもう一度処理しても結果が変わらない性質を前提に、排他が破れた場合の二重実行を処理済み台帳への記録で吸収する設計。
lease化したlock file
ownerId・host・pid・acquiredAt・expiresAt・heartbeatAtを持つ、有効期限付きの所有情報として実装するlock file。更新停止をstale判定の材料にし、削除は原則として作成者だけが行う。
OSファイルロック(OSロック)
advisory lockやbyte-range lockなど、ファイルシステムやOSが提供する排他制御の総称。同一アプリ群・同一前提の中では有効だが、受け渡しプロトコルの代わりにはならない。
advisory lock
参加者全員が約束を守る前提でだけ効くロック。OSが強制しないため、無視して読み書きするプログラムも書ける。Linuxのflockが該当する。
共有フォルダ(SMB)越しのファイル連携
SMB共有フォルダを介してtemp->rename公開やclaimを行う運用。同一共有内では原子性が保たれる一方、ボリュームをまたぐ移動・他プロセスによる開放中の失敗・タイムスタンプの不確実性・変更通知の取りこぼしが追加のリスクになる。
定期的なディレクトリ列挙
イベント通知だけに頼らず、一定間隔でディレクトリを列挙して未検知のファイルを拾う監視方式。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。