この記事は機械翻訳されたものです。

Cutting Edge

長いポーリングと SignalR (機械翻訳)

Dino Esposito

 

Dino Esposito我々 は、逆説的に、考案され多くの相互作用の単純なフォームをデザインするプロトコルの上より高度な Web アプリケーションを構築しています。 HTTP は状態またはセキュリティの組み込みサポートがありません。 その基本的な前提は、クライアント要求の場所し、Web サーバーの応答の問題です。 要するに、つまり要求なし、応答がありません。

Web の現在の普及と Web ソリューションの普及を考えると、柱、Web (HTTP、HTML、JavaScript) の変更は問題外です。 しかし、我々 それらの柱のいくつかの改善を考慮すべきですか? もちろん売りたい。 現代のアプリケーション Web プロトコルおよび言語の限界で特定の要件がある — 以降。

このコラムの最近の記事では、私は、手作りの実装は、サーバーをポーリングし、変更をクライアントに通知するメカニズムの説明。 先月、私は、新興のライブラリのサービスを使用して、同じ考えを実装 — SignalR。 今、技術の概要と、今日のオプションの概要を提供します。 私は SignalR を浴びて、その実装を見て- と、魔法のいくつか。

ポーリングの考慮事項

HTTP 要求と応答の制約を考えると、ポーリング ライブ コミュニケーション クライアントと Web サーバーの間を設定するには、唯一可能な方法です。 クライアント要求で利便性にプッシュされ、熱心に。 ポーリングの有効性を評価するキー」でその利便性「式を割り当てる、実際の意味です常にポーリングに基づくすべてのソリューションの中核は、クライアント要求です。 返信するまで要求を表します。 任意の保留中の要求、ブラウザー接続を消費し、もっと重要なは、その貴重なリソースが他の要求に使用不可にする、サーバー スレッドを行っています。 一言で言えば、あまりにも頻繁に要求を Web サーバーに圧力をビルドします。

しかしスケーラビリティの全体的なアイデア、成長の数の要求を処理するサーバーの能力ではないか。 実際には、ポーリングが新しい拡張性に関する懸念を作成しませんが、新しい要求の数を大幅にスケーラブルで高パフォーマンスを確実に考慮する必要があります、サーバーに追加しています。 我々 はポーリングを実装可能性がある方法を見てみましょう。

AJAX ポーリング

私の 2011 年 12 月に (msdn.microsoft.com/magazine/hh580729) と 2012 年 1 月 (msdn.microsoft.com/magazine/hh708746) 列、私は、リモート操作の進行状況を制御するためのフレームワークを発表します。 AJAX 呼び出しには、全体の枠組みがだった。 まず、クライアント可能性がある時間のかかるタスクを開始するサーバーのエンドポイントを呼び出す; 次に、タイマーを設定します 500 ミリ秒ごとに別のエンドポイントへの同時呼び出しを配置します。 サーバー タスクの仕事としては、既知の場所を更新します。 チェックその場所のデータを単に定期的に呼び出されるが、任意のコンテンツを返すサーバーのエンドポイントをクライアントに見つかった。

この AJAX ポーリング パターンは美しく働き、多くの産業において広く採用されています。 本物のスコアまたはニュース更新を提供するほとんどのサイトでは、このパターンに従ってください。 私の記事では、単にリモート操作の進行状況を監視するのには、特定のシナリオにパターンに適応。

最後に、AJAX ポーリングの問題は、右の更新間隔を見つけ出すことです-1 つは、サーバー上の圧力と情報の正確性のバランスを表すユーザーに報告します。 効果的な AJAX ポーリング ソリューション、コンクリートの意味「要求を送信でクライアントの利便」を与えます。

長いポーリング

AJAX の前に、開発者、メタ更新タグ ブラウザー ページを更新するのにように指示するのにすべて指定した秒数使用。 AJAX ポーリングでは、同じことが、はるかにスムーズな方法達成します。

アプリケーションの増加には、ただし、このフォームのポーリングの十分でないです。 AJAX ポーリングほぼ必然的に、遅延、サーバー イベントの発生と、イベントの通知をクライアントに紹介します。 更新の頻度を調整するで良い解決策を動作することができますまだ AJAX ポーリング多く (ほとんど) ソーシャルアプリケーションを今日必要とするようである定数と継続的な接続を提供することはできません。

ソリューションこのごろポーリング長いらしい。 不思議なことに、AJAX 年前に現れたときに、スマートの AJAX ポーリング、後者を Web 上に非常に効果的でしたので長いポーリングを交換しました。 長いポーリング、Web 上、デスクトップのシナリオでは、同じことについてです。 長いポーリング要求のクライアントの場所し、返す情報付きの状態になるまで、サーバが応答しません。 Web クライアントはのみいくつかの有効な応答が返されることができますが閉じている、保留中の接続を保持します。 まさにあなたが欲しいものを今日は — Web サーバを遅く可能性がありますが。

長いポーリング AJAX ポーリングと比較して、サーバーへの要求の数が各要求に時間がかかることができます。 サーバー スレッドの応答を生成することができますまで行ってしまうので時間をかけて、この Web サーバーの健康に有害なことができます。 少ないワーカー スレッドを特定の時点で利用可能な Web サーバーを必然的に取得その他の要求には応答が遅くなります受信されません。 有効にするのには、長いポーリングいくつかの深刻な実装作業や高度なマルチ スレッド、並列プログラミングのスキルを必要。 年長いポーリングは本当に、オプションではなかったが、それは問題ではなかった需要の継続的な接続がないため。

今日では、タスクの並列ライブラリでは。ネット フレームワーク 4 およびその他の施設で ASP。非同期 HTTP ハンドラー、ポーリング時間を構築するためのネットは、現実的な選択肢となっています。 全体的にみて、長いポーリング フレームワークを学び、対応する AJAX ポーリング フレームワークよりも困難です。 あなたには、Web サーバーに課税しない、適切に設計されたサーバー環境と長いポーリングをサポートすることができます、クライアント環境必要があります。 長いポーリング、実際には、Web と必ずしも古典的な HTTP 要求/応答パケットの数を開発、マクロ クライアント/サーバー操作です。 クライアント マクロ操作が終了するまで、新しい要求を再発行する必要があります。 このポイントを後で戻ります。

SignalR 救助に

SignalR リアルタイム クライアント/サーバー間の通信を容易に設計する Microsoft フレームワークです。 それは、長いは、ポーリングの効果的な実装に深い影響を与える、サーバーでは、持っていないし、同時にリモートで何が起こっているクライアントが適切に更新されていることを保証を提供します。 図 1前回のコラムで示したコードの抜粋を示しています。 「フライトを予約します「マクロ操作を開始するには、Web ブラウザーから呼び出すメソッドは、BookingHub クラスです

Multistep 操作を実行します図 1 SignalR クラス

public class BookingHub : Hub
{
  public void BookFlight(String from, String to)
  {
    // Book first leg
    Clients.displayMessage(
      String.Format("Booking flight: {0}-{1} ...", from, to));
    BookFlightInternal(from, to);
    // Book return
    Clients.displayMessage(
      String.Format("Booking flight: {0}-{1} ...", to, from));
    BookFlightInternal(to, from);
    // Book return
    Clients.displayMessage("Charging credit card ...");
    ChargeCreditCardInternal();
    // Some return value
    Clients.displayMessage("Flight booked successfully.");
  }
}

明確にはマルチ ステップの操作であり、各ステップでクラスが通知をクライアントに送信。 どのように多くの HTTP リクエストが関わっていますか? Fiddler を使用してみましょう (を参照してください図 2)。

The Full Stack of HTTP Requests for the Flight-Booking Operation
図 2 フライト予約操作の HTTP 要求の完全な履歴

SignalR 操作中

メソッド開始クライアント ページから呼び出すと、最初の要求がトリガーされる; これは SignalR のバック エンドにクライアントを識別します。 最初の要求は特別なネゴシエーション要求であることに注意してください。 それはいつも AJAX の接続をネゴシエート、最終的なトランスポートに関係なくなります。 SignalR Web ページには、ページが読み込まれるときに実行される、次のようなコードが含まれています。

$(function () {
  var bookingHub = $.connection.bookingHub;
  bookingHub.start();
}

この方法では、ページはサーバー側の bookingHub オブジェクトのサービスを起動するための接続を開くにはその意図を宣言します。 サーバー側ハブ オブジェクトのパブリック インターフェイスによるとクライアント オブジェクトを作成するには、魔法のよう SignalR であることに注意してください。 JavaScript オブジェクト、サーバー オブジェクトの名前と一致します。 ただし、クライアントで使用されている名前を変更するには、HubName 属性を使用できます。

[HubName("booking")]
public class BookingHub : Hub
{
  ...
}

スタートアップ要求、クライアント、後続の要求に沿って通過するクライアント ID を返します。

{"Url":"/signalr","connectionId":"2a119962-edf7-4a97-954b-e74f2f1d27a9"}

次に、クライアント ライブラリは接続のための別の要求を配置します。 これは、サーバー上の接続を発生、OnConnect イベントの結果、「接続」要求です。 図 3 接続要求数を示します。

Reiterating Connection Requests
図 3 接続リクエストを繰り返し

最初の 2 分で完了した; 2 番目は保留中。 これは、長いの本質であるポーリング — クライアント継続的に開いているチャネルにサーバーがあります。 データをクライアントに送信する必要があります、サーバー上のアクションが実行されない場合、サーバーは、要求を 2 分後回します。 フライト予約アプリケーション UI で、フライトの予約を開始するには、ユーザーがクリックしてできるボタンです。 ユーザーがボタンをクリックすると、次のコードを実行します。

bookingHub.bookFlight("fco", "jfk");

先月のコラムからサンプル アプリケーションを作成する場合は、このコードを [ページ] ボタンの click ハンドラーにリンクする必要があります。

BookingHub signalr ・ ハブの URL を介して、SignalR をダウンロードするスクリプトに示すように属する図 3。 bookingHub は、長いポーリング パターンの実装の複雑さを隠蔽するプレーン プロキシ オブジェクトです。 ボタンをクリックすると、新しいサーバーへの要求、クライアント ID が埋め込まれているトリガーされます。 サーバーは、保留中の呼び出しが、クライアントから呼び出しを受信すると、保留中の呼び出しを終了し、で示すように、新しい要求の処理を開始図 4

A Multistep Operation Is Taking Place
図 4 マルチ ステップの操作が起きています。

図 4 は、保留中の要求 (signalr/送信)、2 つの完了した要求と別の保留中の要求を示しています。 Signalr、送信要求、元のソース コードで表示されます、フライトの予約、マクロ操作です図 1

コードで図 1 任意の進行状況を通知するさまざまな段階で、クライアントを呼び出すましょう。

Clients.displayMessage(...);

Signalr 送信の要求を配置した同時に、通知を待機する別の要求を開始します。 あるまでバックを送信するいくつかのデータは、この要求を待機します。 サーバー コードでクライアントへの呼び出し通知の要求が完了してすぐに、クライアントから別の 1 つをのでトリガーでシーケンス図 4 2 つの手順が完了されている、2 つの進行状況メッセージがクライアントによって受信されることを意味します。 サーバー プロセスは、3 番目のステップを達成しようとして忙しいようになりました。 コードの最後で図 1、すべての要求で 図 4 が完了して、状況に何のように戻ります図 2

長いポーリングを超えて

長時間の動作を比較する場合 SignalR の手順の実装をポーリングは示さ AJAX ポーリング、についての私の記事の一般的なパターンを認識する必要があります — 進行状況のインジケータ パターン。 ポーリングとポーリングの長いの AJAX は、同じパターンの 2 つの異なる実装です。 より効果的なもので、Web サーバーの構成と、アプリケーションの要件によって異なります。 それはあなたの呼び出しです。 いずれの場合では、長いポーリングを選ぶ場合は、SignalR または、類似のライブラリを必要。 独自のフレームワークを構築する場合は、あなたが選ぶ AJAX ポーリング、少ないが、長い呼び出し長い対の多くが簡単な呼び出しを提案するポーリングします。

効果的な長いポーリング枠組みの構築が難しいことができます。 AJAX ポーリングをおそらく継続的な接続を取得しないが、またサーバを遅くリスクはありません。 このことを念頭に、私はおそらくされません回るし、SignalR に私の世話をリアルタイムの Web サーバーを更新します。 SignalR がリリースされたら、しかし、私は新しいアプリケーションには使用しないように何らかの理由を見ない。

最後に、SignalR が今長いポーリング以外その他上位レベルのトランスポートをサポートしていることを述べる価値があるとは。 最新のソースには、WebSockets のサポート Windows 8 サーバーも; サーバーは、クロム、Firefox、オペラ、サファリのイベントを送信; 永遠に上の Internet Explorer のフレームします。 ライブラリは、リストの先頭から開始し、戻るサポートされているトランスポートが見つかるまで下落を保持します。 だから、最後に、長いポーリング実際にほとんどほとんどの場合に使用されます。

Dino Esposito著者である「プログラミング ASP。4「(Microsoft Press、2011年) ネットと「ASP プログラミング。ネットの MVC 3」(マイクロソフト プレス、2010年) と共著者の「Microsoft。ネット:Architecting Applications for the Enterprise』(Microsoft Press、2008 年) の共著者でもあります。 Esposito はイタリアに在住し、世界各国で開催される業界のイベントで頻繁に講演しています。 彼は Twitter の上に従う Twitter.com/despos

この記事のレビュー、技術スタッフに感謝:Damian Edwards