9

同期 http リクエスト/レスポンス モデルを非同期キュー ベースのモデルに接続する良い方法は何ですか?

ユーザーの HTTP 要求が来ると、キュー (この場合はbeanstalkd ) に送られる作業要求が生成されます。ワーカーの 1 人がリクエストを受け取り、作業を行い、レスポンスを準備します。

キュー モデルはリクエスト/レスポンスではありません。レスポンスではなく、リクエストのみがあります。問題は、応答を HTTP の世界に戻し、ユーザーに戻すにはどうすればよいかということです。

アイデア:

  1. Beanstalkd は、軽量のトピックまたはキュー (チューブと呼ばれます) をサポートしています。リクエストごとにチューブを作成し、ワーカーにそのチューブでメッセージを作成させ、http プロセスをチューブに置いて応答を待機させることができます。これは特に好きではありません。Apache プロセスがメモリを占有しているからです。

  2. http クライアントに応答をポーリングさせます。ユーザーの最初の HTTP 要求は、キューでジョブを開始し、すぐに戻ります。クライアント (ユーザーのブラウザー) は定期的に応答をポーリングします。バックエンドでは、ワーカーはその応答を memcached に置き、nginx を memcached に接続して、ポーリングが軽量になるようにします。

  3. コメットを使用します。2 番目のオプションに似ていますが、ポーリングを回避するためにより洗練された http 通信を使用します。

簡単でよく知っているので、私は2に傾いています(私はまだコメットを使用していません)。おそらく、私が思いもよらなかった、はるかに優れた明白なモデルもあると思います。どう思いますか?

4

3 に答える 3

1

JMS でリクエスト/レスポンスを効率的に実装する方法は次のとおりです (Java/JMS 中心ですが)。一般的な考え方は、クライアント/スレッドごとに一時キューを作成し、correlationID を使用してリクエストを応答などに関連付けることです。

于 2009-01-14T21:20:41.543 に答える
1

ポーリングは簡単な解決策です。comet はより効率的なソリューションです。あなたはそれを釘付けにしました:)

私は個人的に comet が大好きです ( WebSyncの作成を手伝ったので偏見がありますが)、クライアントがチャンネルにサブスクライブし、サーバー プロセスの準備が整ったときにメッセージを受け取ることができます。チャンピオンのように機能します。

于 2010-01-11T20:37:57.463 に答える
0

Beanstalkd および memcached システムを実装して、リクエストに続いて多数のプロセスを実行することを検討しています。この場合、ユーザーがログインしたときに情報を検索します (たとえば、ユーザーが待機しているメッセージの数)。情報は Memcached に保存され、次のページ読み込み時に読み戻されます。

ただし、自分が行っているタスクについてもう少し知らなければ、何をどのように行う必要があるかを言うのは簡単ではありません。ただし、オプション #2 は最も単純であり、ワーカーに何をプッシュするかによっては、これで十分な場合があります。

于 2009-01-15T19:22:15.497 に答える