web-dev-qa-db-ja.com

SignalR:なぜハブと永続的接続を選択するのですか?

私は最近SignalRを検索して読んでいますが、ハブと永続的な接続の違いについて多くの説明を見ていますが、次のレベルを回避することができませんでした。他のアプローチよりも1つのアプローチを選択しますか?

149
Craig W.

Connection and Hubsセクション に表示されていることから、ハブは、下位レベルの永続的な接続をオーバーレイするトピックシステムを提供しているようです。

以下の高く投票されたコメントから:

部分的に正しい。永続的な接続でもトピックまたはグループを取得できます。大きな違いは、異なるタイプのメッセージをディスパッチすることです。たとえば、さまざまな種類のメッセージがあり、さまざまな種類のペイロードを送信したい場合。永続的な接続では、メッセージタイプをペイロードに埋め込む必要があります(Rawサンプルを参照) 。もう1つの大きなことは、モデルバインディングです。ハブを使用すると、厳密に型指定されたパラメーターをメソッドに渡すことができます。

ドキュメントで使用されている例では、チャットルームのメタファーを使用しています。ユーザーは特定のルームに参加し、同じルームの他のユーザーからのメッセージのみを取得できます。より一般的には、コードはトピックをサブスクライブし、そのトピックに発行されたメッセージのみを取得します。永続的な接続を使用すると、すべてのメッセージが表示されます。

永続的な接続の上に独自のトピックシステムを簡単に構築できますが、この場合、SignalRチームはすでに作業を行っています。

92

主な違いは、PersistentConnectionでRPCを実行することはできず、生データのみを送信できることです。このようにサーバーからメッセージを送信する代わりに

Clients.All.addNewMessageToPage(name, message);

Connection.Broadcast()またはConnection.Send()でオブジェクトを送信する必要があり、クライアントはそれをどう処理するかを決定する必要があります。たとえば、次のようなオブジェクトを送信できます。

Connection.Broadcast(new {
    method: "addNewMessageToPage",
    name: "Albert",
    message: "Hello"
});

クライアントでは、単に定義するのではなく

yourHub.client.addNewMessageToPage = function(name, message) { 
    // things and stuff
};

すべての着信メッセージを処理するコールバックを追加する必要があります。

function addNewMessageToPage(name, message) {
    // things and stuff
}

connection.received(function (data) {
    var method = data.method;

    window[method](data.name, data.message);
});

OnReceivedメソッドでサーバー側で同じ種類のディスパッチを行う必要があります。また、ハブメソッドのように強く型付けされたオブジェクトを受け取る代わりに、データ文字列を逆シリアル化する必要があります。

ハブよりもPersistentConnectionを選択する理由は多くありません。私が気づいている理由の1つは、ハブを使用して実行できないPersistentConnectionを介して 事前シリアル化されたJSONを送信 することが可能であることです。特定の状況では、これは関連するパフォーマンス上の利点になる場合があります。

それとは別に、 documentation からの引用を参照してください:

コミュニケーションモデルの選択

ほとんどのアプリケーションは、ハブAPIを使用する必要があります。 Connections APIは、次の状況で使用できます。

  • 送信される実際のメッセージの形式を指定する必要があります。

  • 開発者は、リモート呼び出しモデルよりもメッセージングおよびディスパッチモデルを使用することを好みます。

  • メッセージングモデルを使用する既存のアプリケーションは、SignalRを使用するように移植されています。

メッセージ構造によっては、PersistentConnectionを使用することでパフォーマンス上の利点がわずかに得られる場合もあります。

SignalRサンプル、特に this here。 をご覧ください。

63
Lars Höppner

SignalRを使用するには2つの方法があります。PersistentConnectionクラスをオーバーライドすることで低レベルでアクセスできます。これにより、多くの制御が可能になります。または、高レベルの「ハブ」を使用して、SignalRにすべての面倒な作業を任せることができます。

23
msn.secret

永続的接続は低レベルのAPIです。接続を開いたり閉じたりするときに、より具体的な時間にアクションを実行できます。ほとんどのアプリケーションでは、ハブが最適です

5
xurxodev

これら2つを比較する際に考慮すべき3つの主要なポイントがあります。

  • メッセージフォーマット
  • 通信モデル
  • SignalRのカスタマイズ

ハブでは、メッセージのフォーマットは基本的にユーザーから処理されますが、永続的な接続ではメッセージは生であり、トークン化され、前後に解析されます。メッセージサイズが重要な場合は、永続的な接続のペイロードがハブのペイロードよりもはるかに少ないことにも注意してください。

通信モデルに関して言えば、基本的に、永続接続にはメッセージングを送受信する機能があり、ハブは要件ごとに固有の機能を持つ リモートプロシージャコール モデルを使用します。

永続的な接続はより低レベルであるため、カスタマイズに関しては、カスタマイズをより詳細に制御できる場合があります。

4