5

アプリケーションのグローバルな状態を維持するサーバーがあります。

クライアントはサーバーに接続し、グローバル状態の変化に関するメッセージを取得できます (サーバーが情報をブロードキャストするためのパブリッシュ/サブスクライブ メカニズム)。

ただし、起動時には、クライアントはグローバル状態に関する情報をまったく持っておらず、それを必要としています。私が望むのは、システムにサブスクライブする新しいクライアントの場合です。最初の通知メッセージは、アプリケーションの完全な状態です。次に、この状態に関する変更のみを受け取ります。

  1. クライアントがメッセージング システムに接続する
  2. メッセージングシステムにサブスクライブします
  3. 取得する最初のメッセージは、システムの完全な状態です
  4. 次に、グローバル状態に関する変更のみを受け取ります

この考え方は、新しいプレーヤーが最初にゲームの完全な状態を取得する必要があるマルチプレーヤー ゲームに似ており、その後、ゲームの変更のみが送信されます。

ActiveMQ や Stomp などのメッセージング システムは、複数の言語に対応し、複数のトランスポート レイヤーで使用できるため、私のニーズには適しています。ただし、完全な状態を送信する (または一貫した方法で最後の変更を累積する) という概念はありません。

もちろん、この状態を静的な方法で簡単に提供することもできます (最初に完全な状態を取得し、次にパブリッシュ/サブスクライブ システムにサブスクライブします)。完全な状態を処理している間? この変更は、取得したばかりのグローバル状態で既に考慮されていますか? ...)。ただし、Stomp と ActiveMQ によって既に提供されている多言語/複数トランスポートの側面は失われます。

それを行うための既存のライブラリ/ツールはありますか? ActiveMQ の何らかの拡張機能はありますか? ストンプに似た何か?それとも手作りする必要がありますか?

4

1 に答える 1

2

これはメッセージング ドメインの問題ではなく、特定のユース ケースです。Pub/Sub はプロデューサー/コンシューマーに関する状態情報を知るようには設計されておらず、メッセージをプロキシするだけです。

そうは言っても、ギャップを少し埋めるために使用できるいくつかの異なる再配信パターンがあります ( Last Image Subscription Policyなど) が、私はより単純なソリューションを選択します。また、 Apache Camelのようなものを使用してプロデューサーとサブスクライバーの間に座って、この追加のロジックを提供することを検討することもできます..

あなたが言ったように、トリッキーな部分は、取得した完全なシステム イメージと増分更新を同期させることです。上から、これが私がすることです...

  • クライアントがシステムの完全な状態を取得できるようにする REST サービスを提供する
  • 完全な状態データと増分更新データの両方に増分バージョン番号を追加する
  • クライアントがオンラインになったとき
    • サブスクライブして増分更新の取得を開始します (今のところ内部でキューに入れます)
    • REST サービスを使用して完全なシステム状態を取得する
    • 次に、増分更新の処理を開始し、バージョン番号に基づいて古いものを無視します
于 2012-04-23T17:53:08.783 に答える