2012-04-23 14 views
4

私はアプリケーションのグローバル状態を維持するサーバーを持っています。システムのフル状態へのアクセスを維持している間にサブ/サブ。

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

しかし、起動時には、クライアントにはグローバル状態に関する情報が全くなく、必要な情報があります。私が望むのは、新しいクライアントがシステムに加入していることです。最初の通知メッセージは、アプリケーションの完全な状態です。クライアントがメッセージングシステム

  • に接続し、それはそれを取得最初のメッセージは、システム
  • の完全な状態であるメッセージングシステム
  • に加入して

    1. :それから、彼らは唯一、この状態に関する変更を受け取りますグローバル状態に関する変更のみを受け取ります

    このアイデアは、新しいプレーヤーが最初にゲームの完全な状態を取得し、次にゲームの変更のみが送信されるマルチプレイヤーゲームに似ています。

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

    もちろん、私はこの状態を静的な方法で簡単に提供することができます(最初は完全な状態になり、次にパブリッシュ/サブスクライブシステムを購読します)。しかし、その間に起こりうる変更に注意する必要があります完全な状態を処理している間にいくつかの変更が失われますか?私が検索したばかりのグローバル状態では、この変更はすでに考慮されていますか?しかし、私はStompとActiveMQによって既に提供されているマルチ言語/マルチトランスポートの面を失います。

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

  • 答えて

    2

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

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

    言い換えれば、取り上げたシステムイメージと同期して増分アップデートを維持することです。トップから、ここに私がやることがあります...

    • 任意のクライアントは、クライアントがオンライン
        を来るとき、完全な状態データと差分更新データ
      • の両方にインクリメントバージョン番号を追加するシステム
      • の完全な状態を引っ張ることができるようにRESTサービスを提供
      • は、株式会社の処理を開始し、その後、完全なシステム状態
      • を取得するために、RESTサービスを使用
      • (今の内部にそれらをキューイング)増分更新を取得を開始するためにサブスクライブremental更新とバージョン番号
    +0

    に基づいて古いものを無視ええ、それは私が、デフォルトではどうなるのかもあります。私は他のいくつかの日を待っています。 –

    +0

    クール...誰かがよりクリーンなアプローチを知っていれば私は不思議です...良い質問 –

    関連する問題