𝗦𝗰𝗮𝗹𝗶𝗻𝗴 𝗖𝗦𝗩 𝗜𝗺𝗽𝗼𝗿𝘁𝘀 𝗪𝗶𝘁𝗵 𝗟𝗮𝗿𝗮𝘃𝗲𝗹 𝗝𝗼𝗯 𝗕𝗮𝘁𝗰𝗵𝗶𝗻𝗴

B2B SaaS のクライアントは、しばしば大容量のファイルをアップロードします。10万行ある CSV ファイルを想像してみてください。

多くの開発者が間違いを犯します。ループを使用して 10 万個の個別のバックグラウンドジョブを送信してしまうのです。これは問題を引き起こします。

もし 45,000 番目のジョブが失敗した場合、ユーザーに伝える手段がありません。進捗を追跡することも、ファイル全体の処理が完了したときに一度だけメールを送信することもできません。各ジョブはバラバラの状態なのです。

これを解決するには、Laravel Job Batching が必要です。

The Solution: Bus::batch()

ジョブバッチングは、数千のジョブを一つのユニットとしてグループ化します。Laravel はこのユニットに一意の ID を付与します。フロントエンドはこの ID を使用してプログレスバーを表示できます。また、成功時や失敗時の処理を行うためのフックも提供されます。

How to implement it:

  • メモリ効率の良いジェネレーターを使用して CSV を読み込む。
  • データを管理可能なサイズにチャンク(分割)する。
  • Bus::batch() を使用してジョブをグループ化する。
  • allowFailures() を使用して、1つの不正な行によってプロセス全体が停止しないようにする。

The lifecycle hooks work like this:

  • then(): すべてのジョブが成功した場合のみ実行されます。
  • catch(): 最初のエラーが発生したときに実行されます。
  • finally(): 一部のジョブが失敗した場合でも、すべてのジョブが終了したときに実行されます。

The Benefit for Users

React フロントエンドでバッチ ID をポーリングすることで、0〜100% のプログレスバーを表示できます。これにより、不透明なバックグラウンドタスクが、透明性の高い体験へと変わります。

The Engineering Value

分散されたタスクを制御できるようになります。サイレントな失敗を防ぎ、ユーザーにリアルタイムのデータを提供できます。また、後処理のロジックを適切なタイミングで確実に実行できます。

Source: https://dev.to/iprajapatiparesh/scaling-csv-imports-master-laravel-job-batching-iaa