2012-03-30 7 views
2

私は、ウェブサイトが他のシステムと複雑かつ秘密の(したがって暗号化された)データを交換する必要があるプロジェクトに取り組んでいます。パブリッシュ/サブスクリプション/ビッグで複雑な機密データの交換のリクエスト?

非常に多くの空を作成するので、従属システムへのリクエスト - 返信パターン(およびその多くがあります)を避けることをお勧めします。トラフィック。

一方、私は純粋なパブリッシャ/サブスクライバパターンが適切であるとは確信していません。主に、交換されるデータの複雑で大量の性質のためです。

このため、「公開/購読/要求」ソリューションの可能性について検討しました。パブリッシュ/サブスクライブ部分は、依存システムにメッセージを発行し、何かが取り出せる状態になることです。実際のコンテンツは、古い学校のRequest-Replyアクションによって取得されます。

この音はどのように聞こえるのですか?あなたは夜/週末のためにオフにされているPCにメッセージを送信することはできません - 依存のシステムが常にオンラインである場合

よろしく、 モルテン

+0

したがって、サブスクライバは中央メッセージストアにポーリングしてメッセージがあるかどうかを確認します。そして、もしあれば、彼らはそれを要求しますか? – henginy

+0

@henginy、サブスクライバはストアから何かを受け取ることができるメッセージを受信しません。このようにして空の投票をすべて避けることができます。 – Morten

答えて

3

システムが常にオンラインになっている場合は、といい、と表示されます。

のためにPubSubHubbubを参照してください。1.すでに解決されている問題を解決しないでください。それはスケーラブルであり、心配の良い分離を表しています。

それは3つの政党含まれます(特定の出版物に興味がある)加入者

  • ハブ(仲介し、 'ポーリング' を取り除く)
  • (ものを公開)

    1. 出版
    それは次のように動作します

    1. 加入者は、URLへの関心をハブに登録し、コールバックURLを提供します。
    2. パブリッシャーは、コンテンツの公開時にハブに通知します。
    3. ハブは「デルタ」を取り出し、興味のある加入者にプッシュします。

    プロトコル自体はAtomの拡張版ですが、あなたの要件に合うようです。新しいAtomの 'コンテンツ'は、新たに公開されたドキュメントのURLを含むアイテム(別々にダウンロードできる)になる可能性があります。

    新規/変更された文書=それら=>ハブ=>契約者をフェッチするURLを含む飼料で>新/修正項目=>出版社

    +0

    私がAronに書いたように:私は、私の説明したソリューションがオフラインの加入者をサポートすべきだと考えました。それはどうですか? :-) Morten – Morten

    +1

    あなたが説明するデザインでは、サブスクライバがオフの場合にパブリッシュ通知はどうなりますか?私は計画が次のようなものだと思う:出版社は失敗した通知を毎回頻繁に再試行するか?これは逆の 'ポーリング'とほとんど同じです。したがって、投票する必要がないという利点はなくなりました。したがって、関係するサービスが通常はすべて「アップ」されていない限り、アプローチはその利点を失います。 – ArjunShankar

    +0

    まさに:-)すべてのサービスは通常95%以上アップするべきです。しかし、私は100%と仮定することはできません。 – Morten

    1

    このアプローチは動作します。

    クライアントが24時間365日稼働するサーバーの場合、これは機能します。そうでない場合は、この方法を試してください:新しい文書がそれらをすべて送って、クライアントが接続すると、データベース内

  • 「クライアントXがこれを見る必要がある」エントリを追加し、入って来たとき

    1. は、クライアントが自分自身
    2. 登録してみましょうエントリ。
    3. クライアントが文書を正常にダウンロードしたときは、「クライアントXはこれを見る必要があります」というエントリを削除します。それは作業台を小さく保ちます。

    この

  • は、いくつかの利点があります。

    1. クライアントが文書を見た後にクライアントが24/7
    2. フラグのみが削除されますを実行する必要はありません(そう何も更新が失われないことができます) 。
    3. あなたは1つの場所で、どのクライアントがドキュメントを引き出すのかわかりません。シンプルなselect client, count(*) group by client having count(*) > 10は、問題について教えてくれます。
    4. ほとんどのクライアントはデータをタイムリーにフェッチしますので、作業表は小さく留まります。つまり、「今は何ですか」というデータを収集する必要があるときにオーバーヘッドはほとんどありません。

    EDITオフライン加入者の問題は、欠落しているものがわからないことです。したがって、送信側は失敗したプッシュ/プル要求を追跡する必要があります。つまり、壊れた接続を再開できるように、私の提案する疑似コードを実装する必要があります。

    +0

    @Aron、私は私の説明したソリューションがオフライン加入者をサポートすべきだと考えました。それはどうですか? :-) Morten – Morten

    3

    から文書を引いて、私はこれについての素晴らしい経験を持っていますが、ありませんメッセージングキューは、必要なものを達成するのに役立ちます。私はこのようなシステムを使用して、バックエンドから複数のフロントエンドクライアントにデータを公開して管理しています。

    クライアントがオフの場合、データは消費されず、サーバーは傍受されているデータの肯定応答を受信しません。クライアントがオンラインに戻ると、彼はデータを消費し、待ち行列上にあるより多くのメッセージを聞いたままです。そして、出版社は、消費されているデータについてackを受け取ります。このようにして、受信側で問題を抱えている人物を識別し、ボーナスとして通知することができます。あなたのケースでこれができますか?