3

ここで質問するのが良いのか、Programmers.SEで質問するのが良いのかわかりません。間違っている場合は、移行してください。

まず、私が実装しようとしていることについて少し説明します。1つのソース(socket.ioクライアント)からメッセージを取得し、メッセージを処理するnode.jsアプリケーションがあります。これにより、送信者またはその中の他のクライアントに0個以上のメッセージが返される可能性があります。グループ。

処理については、基本的にメッセージをキューに入れて、さまざまなメッセージプロセッサを通過し、独自のアイテムを開始する可能性があります。最終的に、socket.ioを実行しているビットに「ねえ、これを送信してください」と通知されます。メッセージバック」

具体的な例として、ユーザーがサービスにサインインすると、そのサインインメッセージはキューに入れられ、承認プロセッサがそれを取得し、それを実行してから、クライアントが承認されたことを示すメッセージをキューに戻します。これは、関心のある可能性のある他のクライアントとともに、クライアントに接続されているsocket.ioソケットに戻ります。また、承認でより多くの処理を実行する可能性のある他のサブシステムに移動することもできます(ユーザー情報の検索、データに基づいてクライアントにさらに情報を送信するなど)。

強力な結合が必要な場合、これは簡単ですが、以前に試したところ、非常に壊れやすいスパゲッティコードが混乱するため、これは避けたいと思います。セットアップのもう1つの問題は、これがクラスター化可能である必要があることです。これが実際の問題の原因です。たとえば、複数の承認プロセッサーが実行されている可能性があります。ただし、許可メッセージは1回だけ処理する必要があります。

つまり、基本的に、メッセージのサブスクライバーの複数の「グループ」を作成できるパターン/手法を探しています。メッセージは、グループごとに1回だけ処理されます。

プロセッサの各インスタンスに、Reidsでリストとして使用される一意の名前を生成させることを考えました。次に、この名前はある種のディスパッチハンドラーに登録され、そのサブスクライバーのグループのセットに配置されます。次に、メッセージが到着すると、ディスパッチはそのセットからランダムなメンバーを引き出し、それをそのリストに配置します。これはうまくいくように見えますが、やや複雑すぎて壊れやすいようです。

中心的な問題は、私がこのようなシステムを設計したことがないことです。そのため、使用または検索する適切な用語さえわかりません。誰かが私をこれに対して正しい方向に向けることができれば、私は最も感謝するでしょう。

4

3 に答える 3

2

あなたの説明はhttps://www.getbridge.com/サービスに似ていると思います。私はそれですが、zeromqに基づいて自分で作成することになりました。これにより、サービス、req-> <-rec、およびpub/subワーカーであるチャネルを登録できます。

設計に関しては、クライアント->ブローカー->自動検出を使用してすべてプラグアンドプレイであるサービスとチャネルを使用しました。サービスは、他のサーバー上のブローカーが通信できるように、tcp接続を開くブローカーにスキーマを登録します。そのブローカーグループサービスで。次に、内部サービスとクライアントは、UNIXソケットまたはipcチャネルのどちらか優先される方を介して接続します。

于 2012-09-24T00:24:04.360 に答える
2

これを行うために、redisのパブリッシュ/サブスクライブ関数を少しラップすることになりました。各タイプのメッセージプロセッサには「グループ名」が付けられ、そのグループ内にプロセッサの複数のインスタンスが存在する可能性があります(したがって、プログラムの複数のインスタンスをクラスタリングのために実行できます)。

メッセージを公開するときは、インクリメンタルIDを生成し、そのIDを持つ文字列キーにメッセージを保存してから、メッセージIDを公開します。

受信側では、サブスクライバーが最初に行うことは、パブリッシャーから取得したメッセージIDを、。を使用してそのグループの受信メッセージのセットに追加しようとすることですsaddsaddが返された場合0、メッセージはすでに別のインスタンスによって取得されており、返されるだけです。が返さ1れると、メッセージ全体が文字列キーから取り出され、リスナーに送信されます。

もちろん、これはRedisがシングルスレッドであることに依存していますが、これは今後も続くと思います。

于 2012-09-24T01:36:21.070 に答える
1

探しているのはAMQPプロトコルの実装です。ここでは、キューにカスタム交換を取得させ、pub-subモデルを実装できます。

RabbitMQ-多くのライブラリを備えた人気のあるamqpプロトコルの実装

node.jsライブラリもあります

于 2012-11-05T14:47:00.930 に答える