Webページの変更についてWeb以外のアプリケーションに通知する最良の方法は何ですか?
-
03-07-2019 - |
質問
ある程度連携して動作する2つのアプリケーションがあるとします。
- Webアプリケーション(PHP、Ruby on Railsなど)
- デスクトップアプリケーション(Java、C ++、...)
デスクトップアプリケーションはWebアプリケーションから通知される必要があり、通知の送信と受信の間の遅延は短くなければなりません。 (<!> lt; 10秒)
これを行うための可能な方法は何ですか?ポーリングは10秒間隔で考えることができますが、多くのデスクトップアプリケーションに通知する必要がある場合、大量のトラフィックが発生します。 LANではUDPブロードキャストを使用しますが、残念ながらここではできません...
ご意見をお寄せいただければ幸いです。
解決
<!> quot;ベストプラクティス<!> quot;ここで提供するデスクトップクライアントの数によって異なります。通知するデスクトップが1つしかない場合、ポーリングは適切なアプローチになる可能性があります。はい、ポーリングはイベントベースの通知よりもはるかにオーバーヘッドが大きくなりますが、実装するのが最も簡単なソリューションになることは確かです。
ポーリングのオーバーヘッドが本当に許容できない場合、2つの基本的な選択肢があります:
- デスクトップとWebサーバー間の永続的な接続を開いたままにします(<!> quot; comet <!> quot;スタイルのWeb要求、またはrawソケット接続の可能性があります)
- デスクトップアプリ内からサービスを公開し、サービスのアドレスをWebサーバーに登録します。このようにして、Webサーバーは必要に応じてデスクトップを呼び出すことができます。
しかし、注意してください-両方の選択肢は、落とし穴でいっぱいです。いくつかのハイライト:
- Webサーバーをホットスワップ可能にしたいので、接続を開いたままにするのは難しい場合があります
- このリクエストがハングする可能性があるため、Webサーバーから外部サービス(デスクトップなど)への呼び出しは危険です。この通知を別のスレッドに移動して、ウェブサーバーが占有されないようにする必要があります。
いくつかの懸念を軽減するために、中間通知サーバーを導入することにより、信頼性の低いデスクトップをWebサーバーから切り離すことができます。通知されます。ここで車輪の再発明を避けるために、これは何らかのMessageQueueシステムを伴う可能性があります...これは、もちろん、新しい仲介者を維持する必要性の複雑さを追加します。
繰り返しますが、これらのアプローチはすべて非常に複雑なので、ポーリングがおそらく最善の策であると思います。
他のヒント
2つの方法があります:
- デスクトップアプリケーションがWebアプリをポーリングします
- Webアプリがデスクトップアプリケーションに通知します
WebアプリはRSSフィードを公開できますが、デスクトップアプリは10秒ごとにフィードをポーリングする必要があります。
トラフィックは巨大である必要はありません:HTTP HEAD リクエストでは、最後の変更の日付を含む小さなパケットを取得します(便宜上、 Last-Modified という名前)。
タスクを達成するために何をすべきか正確にはわかりませんが、デスクトップアプリケーションPCでWindowsサービスを作成することを提案できます。
このサービスは、Webアプリケーションを新しい間隔でチェックし、変更が発生した場合、デスクトップアプリケーションを実行して、WebアプリケーションおよびWebアプリケーションに変更が発生した場合に応答します。謝辞
これが役に立つかもしれないことを願っていますが、正確には試していませんでしたが、このアイデアのように使用することを提案しています。
シンジケーションのレイヤーは、システムのスケールアウトに役立ちます。
デスクトップアプリは、<!> quot; publisher <!> quot;で自身を登録できます。サービス(複数/多くのマシンの1つで実行)このパブリッシャーサービスは、<!> quot; notice <!> quot;を受け取ります。 Webアプリから何かが変更されたことを通知し、登録されたすべてのサブスクライバーへの通知をすぐに開始します。
必要なパブリッシャーの数は、ユーザーの数とともに増加します。
編集:デスクトップアプリはソケットをリッスンする必要があることを忘れていました。