ファイル
btrc-hub/docs/counts-exports.md
T
2026-10-26 21:24:32 +09:00

3.6 KiB

Counts エクスポートワーカー

Counts の画面からのエクスポートは永続ファイルキューへ登録する。 Active Job の既定のプロセス内 async アダプターは使用しない。 追加 gem、外部キュー、DB マイグレーションは不要。

起動・配置

backend で bundle exec rake counts:export_worker を、systemd 等の監視対象として 別プロセスで起動する。Web プロセス内では起動しない。 ワーカー未起動の間は待機状態となる。1 プロセスは同時に1ジョブを処理し、 全体の実行枠は既存の2枠を共有する。ワーカーの起動・配備は実施していない。

Web とワーカーは同一リリース、Rails secret、アプリケーション環境、DB 接続先を 使用する。DB コネクションはワーカープロセスごとに必要。 COUNTS_EXPORT_DIRECTORY を同じ永続 POSIX 共有ディレクトリに設定する。 省略時は backend/tmp/counts_exports。 全プロセスで同一の所有者とアクセス権を使用する。 複数ホストでは、flock・同一ファイルシステム内の atomic rename・fsync が正しく 機能する共有ボリュームが必須。オブジェクトストレージや各コンテナ独立の tmp は不可。 ジョブ JSON と完成ファイルが格納されるため、このディレクトリを静的公開しない。

API と進捗

  • POST /counts/export/jobs:要求検証・実行時点の固定・署名付きジョブトークンの発行。
  • GET /counts/export/jobs/:token:状態、実際の処理済みレコード数、判明している総数。
  • DELETE /counts/export/jobs/:token:取消を永続記録。
  • GET /counts/export/files/:token:生成完了後の署名付きファイルトークンによる取得。

ジョブ・ファイルのトークンは作成元のセッションに紐付く。 既存の BAN・CSRF 制御を使用する。フロントは約800ms間隔で状態を取得する。 明細の総数は同じ読み取りトランザクション内の SQL 件数を使用する。 集計結果の出力セル総数は生成終了まで確定させず、不確定進捗として扱う。 完成状態はファイルの生成完了であり、ブラウザの保存完了を意味しない。

取消・障害・制限

通常は約250ms間隔の生成チェックポイントで取消を検知する。 DB 問い合わせ・ファイル I/O がブロックしている間は即時に中断できない。 取消済みへの遷移は生成処理の終了と一時ファイル削除後に行う。 既に始まった HTTP 転送やブラウザ側の保存は取り消せない。

ワーカーが異常終了したジョブは、次のワーカーが実行ロックを取得した際に失敗状態にし、 そのジョブの残存生成ファイルを削除する。別の読み取り状態で自動再実行しない。 原子的に書き換える状態ファイルとプロセス間ロックにより、二重処理・取消との競合を防ぐ。

既存の同時実行2、1ファイル128MiB、保存領域512MiB、生成120秒、期限10分を維持する。 生成時間制限もチェックポイント方式であり、実行中 SQL の強制停止ではない。 期限切れのジョブ・ファイル・残存状態書込ファイルは登録時またはワーカーの巡回時に削除する。 ワーカーと Web の両方を停止した間は巡回削除も停止する。

これらの処理は静的確認のみで、実環境のキュー処理・取消・転送・共有ボリュームでの 排他動作は未確認。