私は、ユーザーからのリクエストを受け取り、そのリクエストへの回答を作成するために多くの外部 API をヒットする必要がある Web アプリケーションに取り組んでいます。これは、gevent などを使用してメインの Web スレッドから直接実行して、リクエストをファンアウトすることができます。
別の方法として、着信リクエストをキューに入れ、ワーカーを使用して負荷を分散することもできると考えていました。アイデアは、リクエストを複数のワーカーに分割しながら、リアルタイムを維持しようとすることです。これらの各ワーカーは、多くの外部 API の 1 つだけをクエリします。受信した応答は、一連の変換を経て DB に保存され、共通スキーマに変換されて共通 DB に保存され、最終的に 1 つの大きな応答に構成され、Web 要求を通じて返されます。Web リクエストは、ユーザーが待機している間ずっとブロックされている可能性が高いため、キューイングとキューイング解除をできるだけ高速に保つことが重要です。
外部 API 呼び出しは、個々のタスクに簡単に変換できます。1 つの API タスクから DB 保存タスクへの変換へのリンクは、チェーンなどを使用して実行でき、すべての結果を組み合わせた最終結果はコードを使用して Web スレッドに返されると思います。
いくつかの質問:
- セロリを使用してこれを行うことはできますか?
- 私はジャンゴを使用しています。プレーンなセロリよりも django-celery を使用する必要がありますか?
- これらのタスクのそれぞれが、他のタスクを生成する可能性があります。たとえば、発生したばかりのログを記録したり、他の種類の分岐を作成したりします。これは可能ですか?
- タスクは取得したデータを返すことができますか?つまり、潜在的にセロリ (この場合は基になる redis) を介して Kb のデータを返しますか?それとも、DB に書き込み、そのデータへのポインターを渡すだけですか?
- 各タスクはほとんど I/O バウンドであり、最初は Web スレッドから gevent を使用してリクエストをファンアウトし、キューイング設計全体をスキップするだけでしたが、別のコンポーネントに再利用されることが判明しました。Qs を介したラウンドトリップ全体をリアルタイムに維持しようとすると、キューがほとんど空であることを確認するために多くのワーカーが必要になる可能性があります。またはそれは?gevent ワーカー プールを実行すると、これに役立ちますか?
- gevent 固有のタスクを作成する必要がありますか? それとも、gevent プールを使用するとネットワーク IO が自動的に処理されますか?
- 特定のタスクに優先度を割り当てることはできますか?
- それらを順番に保つのはどうですか?
- セロリ抜きで昆布だけでいいの?
- セロリは、延期でき、時間に敏感ではない「タスク」を対象としているようです。このリアルタイムを維持しようとする私は気が狂っていますか?
- 他にどのようなテクノロジーを検討する必要がありますか?
更新: これをもう少しハッシュ化しようとしています。昆布について調べてみたところ、セロリよりははるかに低いレベルではありますが、私が考えていることを実行できるようです. これが私が考えていたことの図です。
Kombu でアクセス可能な raw キューで可能と思われるのは、多数のワーカーがブロードキャスト メッセージをサブスクライブできることです。キューを使用する場合、型と数はパブリッシャーに知られている必要はありません。セロリを使用して同様のことを達成できますか? コードを作成したい場合は、実行時にどのタスクがコードに関与するかを知る必要があるように思われますが、このシナリオでは、リスナーをブロードキャストに追加するだけで、リスナーが参加していることをアナウンスするだけです。最終キューに応答を追加する実行中。
更新 2:ブロードキャスト機能があるようですね。これを和音と組み合わせることができますか? 一般的にセロリと生昆布を混ぜてもいいですか?これは、スムージーに関する質問のように聞こえ始めています。