active: true
derived: false
groups:
- BGIO
header: |
  ノンブロッキングなキャッシュの永続化とタスク追跡
level: 1.23
links:
- ARCH006: NQNGQUULw16h1cxj2M5I4pgAr3bNlRze6AMKu_rdo0s=
- REQ006: 3PN_I3D9BWCwGe4h19vSOVkDSeWNY3sM_fbWg0rwOfk=
normative: true
ref: ''
reviewed: -MZ6T4ZpJxVrD0mMkzwvj80WSEGW-Mnyt4JJWc2iG0g=
status: accepted
text: |
  # ノンブロッキングなキャッシュの永続化とタスク追跡

  ## コンテキストと課題

  大規模なデータのシリアライズや、S3 等のリモートストレージへの保存処理は、ユーザーのメインロジックの実行を妨げる（ブロッキング）要因となっていました。「インフラとしてのキャッシュ処理がユーザーを待たせない」という設計思想を強化する必要があります。

  ## 判断基準

  * **Latency Reduction**: キャッシュの保存処理（特に入出力の重い処理）が、メインスレッドの実行速度を低下させないこと。
  * **Data Integrity**: バックグラウンド保存であっても、プログラムの終了前には全ての保存が完了していることを保証し、データロストを防ぐこと。
  * **API Reusability**: `Spot` インスタンスを何度も再利用でき、かつリソースの適切なクリーンアップ（フラッシュ）が行えること。

  ## 検討した選択肢

  * **Option 1**: 全ての保存処理をメインスレッドで同期的に行う。
  * **Option 2**: 保存処理をバックグラウンド（Fire-and-Forget）で実行し、タスク追跡と `with` ブロックによる自動フラッシュの仕組みを導入する。

  ## 決定事項

  採用した選択肢: **Option 2**.

  キャッシュの保存処理をバックグラウンドで実行し、かつリソースの整合性を保つためのライフサイクル管理を導入します。

  1. **`wait=False` モードの導入**: `@spot.mark` や `cached_run` に `wait` オプションを追加し、保存完了を待たずにメインロジックに結果を返すことを可能にします。
  2. **タスク追跡メカニズム**: 実行中のバックグラウンドタスク（Future）を内部のセットで追跡します。
  3. **Flush (非破壊的待機) の導入**: `with spot:` ブロックを抜ける際に、全てのバックグラウンドタスクの完了を待機する（Flush）処理を実行します。
  4. **再利用性の確保**: コンテキストを抜けても Executor は即座にシャットダウンせず、`Spot` インスタンスを繰り返し安全に利用可能にします。

  ## 影響・結果

  * **ポジティブ**:
      * **レイテンシの改善**: 保存処理がバックグラウンド化され、ユーザーの体感速度が向上する。
      * **データ整合性の保証**: `with` ブロックやプロセス終了時に未完了タスクを必ず待機するため、データの整合性が保たれる。
      * **直感的な API**: グローバルに定義したオブジェクトを、何度も安全に「フラッシュ」しながら使い回せる。
  * **ネガティブ**:
      * **例外ハンドリングの複雑化**: バックグラウンドで発生したエラーは即座に呼び出し元へ伝播しないため、ログによる通知に依存することになる。
