ここでの使用例は次のようになります。
- 私はデータ/値のパブリッシャーを持っています
- 複数の値のコンシューマー (またはサブスクライバー) があり、開始時に値を読み取り/取得し、その後の更新をサブスクライブする必要があります
目標は、パブリッシャーとサブスクライバーの両方が「1 つの」ことだけを行うようにすることです。
例: パブリッシャーがパブリッシュoutside.temperature=28
し、複数のサブスクライバーがその新しい情報に反応します。たとえば、ヒーターをオンにしたり、「長いジョンを連れてきて」というテキスト メッセージを送信したり、モニターのグラフィックを更新したりします。
私が今日(機能している)持っているquery outside.temperature
のは、サブスクライバーが最新の値を(再)送信できるキューを備えたApache ActiveMQです。応答は、クエリを送信したコンシューマー (応答先キュー) に送信されます。新しい値は、同じ名前のトピックに公開されます ( outside.temperature
)。サブスクライバーが (再) 起動するたびに、これが発生します: 現在の状態を照会し、更新をサブスクライブします。
サブスクライバーは次の 2 つのことを行う方法を知っている必要があるため、これはすべて非常に複雑に思えます。
- 値を要求する方法 (キューと応答先キュー) を知っている、つまりポーリング
- 将来の値 (トピック) をサブスクライブする方法を知っている、つまり、プッシュをサブスクライブする
パブリッシャーは、次の 2 つの考え方を実行する方法を知っている必要があります。
- クエリ (キュー) への返信方法、ポーリング リクエストへの回答方法を知っている
- 新しい価値(トピック)を公開する方法を知っている、新しい価値をプッシュする
ここでの目標は、次のようなミドルウェア ソフトウェアを用意することです。
- キーの最後の既知の値を保持 (および永続化)
- そのキーのすべてのサブスクライバーに変更を公開します。つまり、pubsub
- 新しいサブスクライバーに最新の既知の値を (プッシュとして) 送信する
これにより、パブリッシャーとサブスクライバーの両方の複雑さが軽減されます。
これを解決するために Redis を調べてきましたが、PUBSUB 機能は上記の例のトピックを置き換えるだけであり、サブスクライバーの起動 (および応答) 時の現在の値のポーリング、つまりクエリ/キュー部分は置き換えません。
私は ZooKeeper を探していて、それは時計であり、私のニーズを満たしているように見えますが、非常に複雑で、かなり多くのコードが必要です。
私は ØMQ (ZeroMQ) を見てきましたが、Last Value Caching, LVCという用語を見ました。ここでの提案は、パブリッシャーとサブスクライバーの間にプロキシを作成することです。
https://github.com/simonmacmullen/rabbitmq-lvc-pluginのように、RabbitMQ の LVC 拡張機能があります。
私の質問は、カスタム プロキシやプラグインを追加する必要なく、ビルトインのラスト バリュー キャッシングを使用して pub-sub を実行する FLOSS 製品が他にあるかどうかです。