1

私にはサービスがあり、ユーザーの要求ごとに40の外部サービス(API)に情報を取得するように依頼する必要があります。たとえば、あるユーザーが情報を検索していて、私のサービスは40の外部パートナーに情報の取得を依頼し、それを1つのDB(mysql)に集約して、結果をユーザーに表示しています。

現在、私はマルチカールソリューションを持っています。一度に10のパートナーリクエストがあり、誰かがリクエストを完了した場合、ソフトウェアは残りの30から別のパートナーをマルチカールのキューに追加します。完了し、結果はDBにあります。

このソリューションの問題は、多くのサーバーで拡張できないことです。たとえば、2〜3台のサーバーで分割して、一度に40のリクエストを実行し、最も遅いパートナーとして待機できるソリューションが必要です。結果を提供します;-)つまり、最も遅いパートナーが10秒かかった場合、40のパートナーすべての結果が10秒で得られます。マルチカールでは、一度に10〜12を超えるリクエストがあると、問題が発生します。

どのようなソリューションを提供できますか、リソースを可能な限り低くし、1台のサーバーで多くのプロセスを実行してスケーラブルにすることができます。私のソフトウェアはPHPで記述されています。つまり、フレームワークまたはAPIを使用してソリューションに適切に接続する必要があります。

私の問題と必要性をご理解いただければ幸いです。不明な点がございましたら、お問い合わせください。

4

1 に答える 1

1

考えられる解決策の1つは、 beanstalkdApache ActiveMQmemcacheQなどのメッセージキューシステムを使用することです。

大まかな例は次のとおりです。

  • ユーザーがサービスに情報を要求します
  • サービスはリクエストをキューに追加します(おそらく、クエリする40のサービスごとに1つ)
  • 1つ以上のジョブサーバーがキューの作業を継続的にポーリングします
  • ジョブサーバーは、キューからメッセージを取得して作業を行い、データをDBに追加して、キューからアイテムを削除します。

このモデルでは、40個のリクエストを実行する1つのタスクが分散され、1つの「プロセス」の一部ではなくなったため、パズルの次の部分では、一連の作業を完了としてマークする方法を考えます。この部分はそれほど難しくないかもしれませんし、新しい課題をもたらすかもしれません(データとアプリケーションによって異なります)。おそらく、別のcache / db行を使用して、特定のリクエストが完了するために必要なジョブの数にカウンターを設定できます。各キューワーカーがリクエストを完了すると、カウンターを1つ減らすことができます。カウンターが0になると、リクエストが完了したことを確認します。ただし、これを行うときは、カウンターが0になり、何らかの理由でスタックしないようにする必要があります。

それは少なくとも1つの方法です。それが少し役立つか、より多くのアイデアへの扉を開くことを願っています。

于 2012-07-11T22:38:22.593 に答える