最近、SignalR を検索して読んでいますが、ハブと永続的な接続の違いについて多くの説明を見ていますが、次のレベルに頭を悩ませることができませんでした。他のアプローチよりも 1 つのアプローチを選択しますか?
5 に答える
接続とハブのセクションで見たところ、ハブは低レベルの永続的な接続をオーバーレイするトピック システムを提供しているようです。
以下の高評価のコメントから:
部分的に正しい。永続的な接続でもトピックまたはグループを取得できます。大きな違いは、さまざまなタイプのメッセージをディスパッチすることです。たとえば、さまざまな種類のメッセージがあり、さまざまな種類のペイロードを送信したいとします。永続的な接続では、メッセージ タイプをペイロードに埋め込む必要があります (Raw サンプルを参照) が、ハブを使用すると、接続を介して RPC を実行できます (サーバーから、およびサーバーからクライアントへのクライアントでメソッドを呼び出すことができます)。 . もう 1 つの重要な点は、モデル バインディングです。ハブを使用すると、厳密に型指定されたパラメーターをメソッドに渡すことができます。
ドキュメントで使用されている例では、ユーザーが特定のルームに参加すると、同じルーム内の他のユーザーからのメッセージのみを取得できるチャット ルームのメタファーが使用されています。より一般的には、コードはトピックにサブスクライブし、そのトピックに発行されたメッセージだけを取得します。永続的な接続を使用すると、すべてのメッセージを取得できます。
永続的な接続の上に独自のトピック システムを簡単に構築できますが、この場合は、SignalR チームが既に作業を行っています。
主な違いは、PersistentConnection で RPC を実行できないことです。生データしか送信できません。したがって、このようにサーバーからメッセージを送信する代わりに
Clients.All.addNewMessageToPage(name, message);
Connection.Broadcast()
orを使用してオブジェクトを送信する必要が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 を送信できることです。これは、ハブを使用して行うことはできません。特定の状況では、これが関連するパフォーマンス上の利点になる場合があります。
それとは別に、ドキュメントからのこの引用を参照してください:
通信モデルの選択
ほとんどのアプリケーションは Hubs API を使用する必要があります。Connections API は、次の状況で使用できます。
送信される実際のメッセージの形式を指定する必要があります。
開発者は、リモート呼び出しモデルよりも、メッセージングおよびディスパッチ モデルを使用することを好みます。
- メッセージング モデルを使用する既存のアプリケーションは、SignalR を使用するように移植されています。
メッセージの構造によっては、PersistentConnection を使用することでパフォーマンスがわずかに向上する場合もあります。
SignalR のサンプル、具体的にはこちらをご覧ください。
PersistentConnection
SignalR を使用するには 2 つの方法があります。クラスをオーバーライドすることで低レベルでアクセスできます。これにより、SignalR を詳細に制御できます。または、高レベルの「ハブ」を使用して、SignalR にすべての面倒な作業を任せることができます。
この2つを比較する際の主なポイントは次の3つです。
- メッセージ形式
- 通信モデル
- SignalR のカスタマイズ
ハブを使用すると、メッセージのフォーマットは基本的にユーザーが処理しますが、永続的な接続を使用すると、メッセージは生のままで、トークン化されて前後に解析されます。メッセージのサイズが重要な場合は、永続的な接続のペイロードがハブのペイロードよりもはるかに少ないことにも注意してください。
通信モデルに関して言えば、永続的な接続には基本的にメッセージングを送受信する機能があり、ハブは要件ごとに独自の機能を持つリモート プロシージャ コールモデルを採用しています。
永続的な接続はより低レベルであるため、カスタマイズに関しては、カスタマイズをより細かく制御できる場合があります。