実際に自分で行うのはそれほど難しいことではありません。
まず、使用するプロトコルを定義する必要があります。とても簡単です。メッセージ タイプ フィールド、ペイロード サイズ フィールド、実際のペイロードのように。必要なメッセージ タイプSUBSCRIBE
、UNSUBSCRIBE
およびPUBLISH
. SUBSCRIBE
およびメッセージのペイロードは、UNSUBSCRIBE
サブスクライブ/サブスクライブ解除するチャネルの名前です。メッセージのペイロードPUBLISH
は、チャネル名と実際のデータです (もちろんデータのサイズも一緒です)。
すべての加入者を接続するには、中央サーバーが必要です。すべてのサブスクライバー/パブリッシャーは、このサーバーに接続する必要があります。サーバー プログラムは、チャネルごとに 1 つのキューのコレクションを保持します。存在しないチャネルのサブスクライブまたはパブリッシュ メッセージがサーバーに到着した場合は、このチャネルの新しいメッセージ キューを作成します。サーバーは、チャネルごとに、そのチャネルにサブスクライブしているすべてのクライアントのコレクションも必要とします。パブリッシュ メッセージがサーバーに到着すると、問題のチャネルのキューの最後に追加されます。チャネル キューが空でない間は、そのコピーをそのチャネルのすべてのサブスクライバーに送信し、すべてがそれを受信したら、メッセージをキューから削除できます。
サーバーの難しい部分は、おそらく通信部分になるでしょう。簡単な部分は、すべてのキューとコレクションになります。これは、C++ 標準コンテナーをすべて (std::queue
実際のキュー、std::unordered_map
チャネル、およびstd::vector
接続されたクライアントのコレクションなど) に使用できるためです。
クライアントは非常に単純です。必要なのは、サブスクリプションとパブリッシュ メッセージをサーバーに送信し、サーバーからパブリッシュ メッセージを受信できることだけです。難しい部分は、実際のコミュニケーション部分です。
追記:
私は実際にそのようなシステムを自分で構築したことはありません.上記のすべては、私の頭のてっぺんに直接ありました. 経験豊富なプログラマーは、基本を実装するのに数時間以上かかることはありません。経験の浅いプログラマーの場合は、おそらく数日かかります。
Boost ASIOなどを使用できる通信には、チャネルごとに 1 つのスレッドを使用できます。また、 Boost プロパティ ツリーのようなものを使用して、JSONまたはXMLメッセージを構築/解析できます。
ただし、これはすべて車輪の再発明のようなもので、RabbitMQ のような既存のシステムの 1 つを数時間で使い始めることができ、多くの時間を節約できます (そして多くのバグも!)