処理後にリモートBLOBストアにアップロードするファイルがたくさんあります。再試行で失敗した場合のキュー処理
現在のところ、フロントエンド(PHP)はこのようなファイルのリストを作成し、それにJobIDという一意のIDを付けます。次に、一意のIDをBeプロセスに渡されたBeanStalkチューブに渡します。 Go workersというライブラリを使用して、各ジョブIDをnet/http
のように処理します。ジョブIDを受信し、redisリストを取得し、ファイルの処理を開始します。
ただし、現在は一度に1つのファイルしか処理されません。ここでの操作はCPU境界ではなくI/O境界であるため、直感はファイルごとにゴルーチンを使用することが有益であることを示唆しています。
しかし、失敗した場合にアップロードを再試行し、ジョブごとに処理されるアイテムの数を追跡したいとします。 1つのジョブに約10KBのファイルを格納でき、そのジョブの100秒をピーク時に1秒間に送信できるため、無制限の数のゴルーチンを開始することはできません。これに対して正しいアプローチは何でしょうか?
NB:私たちは、必要な場合は、ゴルーチンの最大数のサイズにより緩衝chan
を使用してゴルーチンの数を制限することができ
それは同時実行を制限するに始めるために私を助けました。しかし、今もなお残っている問題は、仕事の成否を把握する方法です。ジョブにはN個のサブタスクが含まれています。これらのタスクはすべて正常に処理されなければならず、それ以外のエラーを報告する必要があります。私はこれにどのようにアプローチするのですか? – agathver
ゴルーチンに渡すチャネルを作成します。ゴルーチンは、エラーを含む操作の結果をそのチャンネルに書き込むことができます。呼び出し元は、そのチャネルから情報を引き出して、必要に応じてエラーを処理できます(たとえば、エラーを記録するか、操作を再試行します)。操作を再試行する必要がある場合は、再試行するために必要なコンテキスト(たとえば、ゴルーチンが再試行するために必要な入力)とエラーを持つカスタム構造体タイプのチャネルを作成します。 – MahlerFive