𝗦𝗰𝗮𝗹𝗶𝗻𝗴 𝗖𝗦𝗩 𝗜𝗺𝗽𝗼𝗿𝘁𝘀 𝗪𝗶𝘁𝗵 𝗟𝗮𝗿𝗮𝘃𝗲𝗹 𝗝𝗼𝗯 𝗕𝗮𝘁𝗰𝗵𝗶𝗻𝗴
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