要件が次のようなクライアント向けのシステムを設計しています。
- 彼らはJSONファイルをアップロードします(1つのオブジェクト/行)
- JSONオブジェクトをペイロードとしてAPIを呼び出す
- 各API呼び出しの状態(成功/失敗)をデータベースに記録する
- 失敗した場合は、1回再試行します。
セロリとsqliteデータベースをバックエンドとして使用して構築することにしました。JSONの行の数は多くなく、メモリに収まる可能性があります。個々のコンポーネントはすべて正常に動作していますが(ファイルのアップロード、ファイルの読み取り、APIの呼び出し、dbへの書き込みなど)、セロリを使用したタスクのディスパッチの全体的なアーキテクチャについてはわかりません。
ファイルにN行あるとすると、次のようになります。
オプションA:
result
列(最初はnull)を持つデータベースにN個のオブジェクトを作成します。- N個のセロリタスクを作成し、オブジェクトIDをパラメーターとペイロードとして渡します
- サブタスクにAPIを呼び出しさせ、オブジェクトの結果フィールドを成功/失敗に更新します。
- 失敗した場合にセロリの再試行機能がAPIを再度呼び出そうとするようにします。
オプションB:
result
列(最初はnull)を持つデータベースにN個のオブジェクトを作成します。- 1つのセロリタスクを作成し、N個のオブジェクトIDとN個のペイロードのリスト全体を渡します
- N個のオブジェクトすべてをループして、各ステップの結果でデータベースを更新します。
- 前のタスクが完了すると、別の1回限りのセロリタスクが起動され、失敗した結果を持つすべてのオブジェクトのデータベースが読み取られて再試行されます。
オプションAは、その単純さのために優先していますが、スケジュールできるセロリタスクの数の制限と、ブローカー(RabbitMQ)がそれを処理するかどうかはわかりません。オプションBの場合、大きなリスクは、セロリタスクが何らかの理由で何らかの行Mで終了した場合、後続のすべてのオブジェクトが試行されることはないということです。
これらの2つについての考え、または3番目に優れた代替案があるかどうか。