Android用のハイブリッドWebアプリがあります。アプリが表示するWebページまたはWebサイトはasp.netにあります。アプリのWebビューで実行されているWebページのJavaScriptは、Ajaxリクエストを10秒ごとにasp.netページに送信します。これは、データベースサーバーに更新されたデータを照会し、ajax呼び出しの結果として必要な値を返します。 これは非常に大量のサイトであると予想されます。
多くの場合、データは同じになります。 10秒ごとにポーリングする必要があるページの代わりに、プッシュ通知を使用して、データが異なる場合にのみデータが送信されるようにすることを検討しています。これを行うためにSignalRと呼ばれるものを調べていますが、それほど悪くはありません。
私が欲しいのは、Webサーバー(IIS8)とデータベースサーバー(Sql Server 2014)へのオーバーヘッドが最も少ないソリューションですしたがって、プッシュ通知が送信された場合、Webサーバーは通常のようにすべてのページインスタンスが静的でステートレスではなく、セッションとして起動された各Webページのインスタンスを追跡する。
つまり、これは、処理時間とリソースを使い果たすという観点から、Webサーバーとデータベースサーバーにどのような意味があるのでしょうか?Webサーバーがこれらすべてのセッションを作成および管理する方が、Webサーバーよりも効率的ですか?全員からのポーリング要求を処理するデータベースサーバー?
明確にするために、配達ドライバーの場所とドライバーの停車地のポーリングを想像してみてください。ドライバーのストップはまったく変更されないか、まれにしか変更されない場合がありますが、ドライバーの場所が変わるたびにドライバーは変更されます。すべての情報を10秒ごとにポーリングして、変更が確実に反映されるようにするか、送信する必要のある情報のみを送信し、送信する必要がある場合にのみ送信する必要がありますか?
ご意見、ご助言をよろしくお願いいたします。
ポーリングからイベント通知に移行する場合、それについて考える最善の方法は、イベントとサブスクライバーの観点からです。
概念では、クライアントの各インスタンスのセッション状態を維持し、通知をクライアントに送信するタイミングを知るために、その代わりにデータベースを効率的にポーリングするWebサーバーを想像します。
このアプローチがサーバーリソースに与える影響について心配するのは当然です。通知の機能をまだ十分に活用しておらず、ポーリングが行われる場所を変更しました。
より効果的な方法は、クライアントが自分自身を登録して、特定のデータが変更されたときに通知を受け取ることです。次に、そのデータが変更されたときに、データが変更されたという通知を発行します。通知フレームワークは、通知を受信(サブスクライブ)するために登録したユーザーを識別し、それらを通知します。
シグナルでこれを行う1つの方法は、「グループ」を使用することです。正確な構造はデータモデルによって異なりますが、この例を使用すると、ドライバーごとにグループを作成できます。シーケンスの簡略図:
このようにして、どこでもポーリングすることなく、クライアントで通知を受け取ります。
コメントに続いて、チャットアプリケーションの例を使用した効率に関するいくつかのメモ:
ポーリングアプローチでは、次のリソースを使用しています:
スケーラビリティ:
シグナル通知アプローチを使用すると、次のようになります。
スケーラビリティ:
これに基づいて、通知アプローチの方が効率的だと思います。ご覧のように、Signalerはグループメンバーシップリストを維持しますが、ポーリングアプローチを使用していても、それを行う必要があります。