知識マップ: ファイル連携の排他制御の基礎知識 - ファイルロックと原子的 claim のベストプラクティス
記事「ファイル連携の排他制御の基礎知識 - ファイルロックと原子的 claim のベストプラクティス」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
この記事は、共有フォルダや夜間バッチでのファイル連携を、OSロック任せではなく受け渡しプロトコルとして設計する考え方を整理する。読む前に処理権を原子的claimで確保し、生成中のファイルはtemp名に閉じ込めてcloseしたあとfinal名へrenameして公開し、完了はサイズやタイムスタンプで推測せずdone・manifestで明示する。lock fileを使うならownerIdやexpiresAtを持つlease形式にしてstale lockに備え、Windowsのbyte-range lockがメモリマップファイルでは無視されることやadvisory lockが約束を無視する相手には効かないことを踏まえたうえで、最後は同じ入力を再処理しても壊れないidempotencyで受け止める設計が実務では強いと結論づける。
flowchart LR
accTitle: ファイル連携の排他制御の知識マップ
accDescr: 受け渡しプロトコルが原子的claim・temp->rename公開・done/manifest・lease化したlock file・idempotencyをどう組み合わせ、二重処理や書き込み途中の読み込みなどの事故をどのアンチパターンに対応させて防ぐかを示す図
file_handoff_protocol["受け渡しプロトコル"]
atomic_claim["原子的claim"]
temp_then_rename_publish["temp -> close -> rename/replaceでの公開"]
done_manifest_file["done/manifestファイル"]
lock_file_lease["lease化したlock file"]
idempotent_processing["idempotency(冪等性)を前提にした処理"]
os_file_lock["OSファイルロック(OSロック)"]
atomic_creation["原子的作成(CreateNew / O_CREAT|O_EXCL)"]
duplicate_processing["二重処理(二重計上・二重送信・更新の消失)"]
exists_then_create_antipattern["Exists->Createの二段階チェック"]
direct_final_write_antipattern["最終ファイル名への直接書き込み"]
partial_write_read["書き込み途中ファイルの読み込み事故"]
size_stability_completion_check["ファイルサイズ安定待ちによる完了判定"]
shared_file_mutual_update_antipattern["共有ファイルの相互更新アンチパターン"]
stale_lock["stale lock"]
byte_range_lock["byte-range lock(範囲ロック)"]
heterogeneous_system_integration["異種システム連携"]
advisory_lock["advisory lock"]
cross_volume_rename_fallback["クロスボリュームのrenameフォールバック(コピー+削除)"]
smb_share_file_handoff["共有フォルダ(SMB)越しのファイル連携"]
rename_fails_on_open_handle["renameが開いているだけで失敗する"]
file_timestamp_unreliability["ファイルタイムスタンプの不確実性"]
periodic_directory_listing["定期的なディレクトリ列挙"]
change_notification_loss["変更通知の取りこぼし"]
file_handoff_protocol -->|"利用する"| atomic_claim
file_handoff_protocol -->|"利用する"| temp_then_rename_publish
file_handoff_protocol -->|"利用する"| done_manifest_file
file_handoff_protocol -->|"利用する"| lock_file_lease
file_handoff_protocol -->|"利用する"| idempotent_processing
file_handoff_protocol -.->|"利用する"| os_file_lock
atomic_claim -.->|"利用する"| atomic_creation
atomic_claim -->|"防止する"| duplicate_processing
exists_then_create_antipattern -->|"原因になり得る"| duplicate_processing
atomic_claim -->|"推奨される対応"| exists_then_create_antipattern
atomic_creation -->|"推奨される対応"| exists_then_create_antipattern
direct_final_write_antipattern -->|"原因になり得る"| partial_write_read
temp_then_rename_publish -->|"防止する"| partial_write_read
size_stability_completion_check -.->|"原因になり得る"| partial_write_read
done_manifest_file -->|"推奨される対応"| size_stability_completion_check
shared_file_mutual_update_antipattern -->|"原因になり得る"| duplicate_processing
idempotent_processing -->|"推奨される対応"| duplicate_processing
lock_file_lease -->|"推奨される対応"| stale_lock
lock_file_lease -->|"前提とする"| atomic_creation
os_file_lock -->|"利用する"| byte_range_lock
os_file_lock -.->|"軽減する"| duplicate_processing
os_file_lock -->|"用いるのは非推奨"| heterogeneous_system_integration
advisory_lock -.->|"用いるのは非推奨"| heterogeneous_system_integration
temp_then_rename_publish -.->|"両立しない"| cross_volume_rename_fallback
smb_share_file_handoff -.->|"原因になり得る"| cross_volume_rename_fallback
smb_share_file_handoff -.->|"原因になり得る"| rename_fails_on_open_handle
done_manifest_file -->|"推奨される対応"| file_timestamp_unreliability
periodic_directory_listing -->|"推奨される対応"| change_notification_loss
smb_share_file_handoff -.->|"原因になり得る"| change_notification_loss
概念間の関係(全29件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- 受け渡しプロトコルは原子的claimを利用します。
- 受け渡しプロトコルはtemp -> close -> rename/replaceでの公開を利用します。
- 受け渡しプロトコルはdone/manifestファイルを利用します。
- 受け渡しプロトコルはlease化したlock fileを利用します。
- 受け渡しプロトコルはidempotency(冪等性)を前提にした処理を利用します。
- 受け渡しプロトコルはOSファイルロック(OSロック)を利用します。
- 原子的claimは原子的作成(CreateNew / O_CREAT|O_EXCL)を利用します。
- 原子的claimは二重処理(二重計上・二重送信・更新の消失)を防ぎます。
- Exists->Createの二段階チェックは二重処理(二重計上・二重送信・更新の消失)の原因になることがあります。
- 原子的claimはExists->Createの二段階チェックに対する本記事の推奨です。
- 原子的作成(CreateNew / O_CREAT|O_EXCL)はExists->Createの二段階チェックに対する本記事の推奨です。
- 最終ファイル名への直接書き込みは書き込み途中ファイルの読み込み事故の原因になることがあります。
- temp -> close -> rename/replaceでの公開は書き込み途中ファイルの読み込み事故を防ぎます。
- ファイルサイズ安定待ちによる完了判定は書き込み途中ファイルの読み込み事故の原因になることがあります。
- done/manifestファイルはファイルサイズ安定待ちによる完了判定に対する本記事の推奨です。
- 共有ファイルの相互更新アンチパターンは二重処理(二重計上・二重送信・更新の消失)の原因になることがあります。
- idempotency(冪等性)を前提にした処理は二重処理(二重計上・二重送信・更新の消失)に対する本記事の推奨です。
- lease化したlock fileはstale lockに対する本記事の推奨です。
- lease化したlock fileは原子的作成(CreateNew / O_CREAT|O_EXCL)を前提とします。
- OSファイルロック(OSロック)はbyte-range lock(範囲ロック)を利用します。
- OSファイルロック(OSロック)は二重処理(二重計上・二重送信・更新の消失)を軽減します。
- OSファイルロック(OSロック)を異種システム連携に用いることは推奨されません。
- advisory lockを異種システム連携に用いることは推奨されません。
- temp -> close -> rename/replaceでの公開はクロスボリュームのrenameフォールバック(コピー+削除)と両立しません。
- 共有フォルダ(SMB)越しのファイル連携はクロスボリュームのrenameフォールバック(コピー+削除)の原因になることがあります。
- 共有フォルダ(SMB)越しのファイル連携はrenameが開いているだけで失敗するの原因になることがあります。
- done/manifestファイルはファイルタイムスタンプの不確実性に対する本記事の推奨です。
- 定期的なディレクトリ列挙は変更通知の取りこぼしに対する本記事の推奨です。
- 共有フォルダ(SMB)越しのファイル連携は変更通知の取りこぼしの原因になることがあります。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。