web-dev-qa-db-ja.com

ポーリングとプッシュ通知

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秒ごとにポーリングして、変更が確実に反映されるようにするか、送信する必要のある情報のみを送信し、送信する必要がある場合にのみ送信する必要がありますか?

ご意見、ご助言をよろしくお願いいたします。

2
user192632

イベントとサブスクライバー

ポーリングからイベント通知に移行する場合、それについて考える最善の方法は、イベントとサブスクライバーの観点からです。

概念では、クライアントの各インスタンスのセッション状態を維持し、通知をクライアントに送信するタイミングを知るために、その代わりにデータベースを効率的にポーリングするWebサーバーを想像します。

このアプローチがサーバーリソースに与える影響について心配するのは当然です。通知の機能をまだ十分に活用しておらず、ポーリングが行われる場所を変更しました。

より効果的な方法は、クライアントが自分自身を登録して、特定のデータが変更されたときに通知を受け取ることです。次に、そのデータが変更されたときに、データが変更されたという通知を発行します。通知フレームワークは、通知を受信(サブスクライブ)するために登録したユーザーを識別し、それらを通知します。

シグナルでこれを行う1つの方法は、「グループ」を使用することです。正確な構造はデータモデルによって異なりますが、この例を使用すると、ドライバーごとにグループを作成できます。シーケンスの簡略図:

  1. クライアントアプリが開始し、シグナルエンドポイントへの接続を開始します
  2. クライアントアプリは、特定のドライバーに関する通知をサブスクライブします
    1. これには多くの方法がありますが、シグナルを使用している場合は、クライアントからサーバーメソッドを 直接呼び出すことができます
    2. サーバーは、要求されたドライバーのグループにクライアントを追加します
  3. ドライバーが新しい場所を報告するとき、そのドライバーのグループにメッセージを送信するように信号装置に伝えます
    1. 厳密にシグナルで言えば、これはサーバーからクライアント側メソッドを 呼び出すことで行われます
    2. これでクライアントは更新された情報を取得し、ページを更新できます
    3. グループにクライアントが登録されていない場合、シグナルは何もしません
    4. グループに複数のクライアントが登録されている場合、シグナルャーはそれらすべてに同じメソッド(引数付き)を呼び出します
    5. domain events などの概念を通じて、シグナルを介して通知を送信するコードからデータを更新する「書き込み操作」をさらに分離できます。

このようにして、どこでもポーリングすることなく、クライアントで通知を受け取ります。

追加して編集-効率

コメントに続いて、チャットアプリケーションの例を使用した効率に関するいくつかのメモ:

ポーリングアプローチでは、次のリソースを使用しています:

  • ストレージ(db/memory):
    • 誰が誰と話しているかのリスト
    • ポーリング要求が最後の要求以降の新しいメッセージを識別できるように、適切なメタデータを含むチャットメッセージの履歴
  • 計算
    • クライアントによってプッシュされた新しいメッセージを処理する-それらを適切に保存する
      • 新しいチャットメッセージごとに1つのリクエストがあります
    • クライアントによるポーリング要求の処理-新しいメッセージのクエリとそれらの返送-は、すべてのクライアントからのすべてのポーリングで発生します
      • 500のクライアントがあり、その一部がアイドル状態の場合でも、毎秒50のリクエストがあります。

スケーラビリティ:

  1. ストレージの負荷は、アクティブなクライアントの数やチャットアクティビティによって増加します
  2. コンピューティングの負荷は、メッセージチャットアクティビティと接続しているクライアントの数とともに増加します

シグナル通知アプローチを使用すると、次のようになります。

  • ストレージ
    • 誰が誰と話しているかのリスト(シグナルは、「グループ」システムで無料でこれを行います。
    • チャットメッセージ(オプション-サーバーにチャットログが必要な場合のみ-非同期で永続化できます)
  • 計算
    • クライアントによってプッシュされた新しいメッセージを処理します。これには、シグナルをグループのメンバーに伝播するようにシグナルを要求することが含まれます
      • 新しいチャットメッセージごとに1つのリクエスト

スケーラビリティ:

  1. ストレージの負荷は、アクティブなクライアントの数だけで増加します
  2. コンピューティングの負荷は、メッセージチャットアクティビティのみで増加します

これに基づいて、通知アプローチの方が効率的だと思います。ご覧のように、Signalerはグループメンバーシップリストを維持しますが、ポーリングアプローチを使用していても、それを行う必要があります。

用語の注記

  • プッシュ通知は、このスペースで明確に定義された意味を持ち、モバイルデバイスのオペレーティングシステムを介して通知を送信し、デバイスのアプリが実行されていなくても通知リスト-例 Apple Push ServiceGoogle Cloud Messaging 。厳密に言えば、シグナルクライアントはそれを提供しません。シグナルクライアントの呼び出しを受信するにはアプリが実行されている必要があるためです。
2
Chris Simon