信号Rと多数のグループ
-
11-12-2019 - |
質問
SignalSRの最新バージョンを使用しています。ただし、最近興味深いスケーリングの問題が発生しました.Signal REはクエリ文字列のクライアントからすべてのクライアントのグループを送信するようです。私のシステムでは、ユーザーが多数のグループに参加する必要があります。これは、ユーザーが購読しているすべてのプロジェクトを表し、それらのいずれかに通知を受け取ります。
この多数のグループ(およびIDSのGUIDを使用しているME)には、クエリストリングが最大サイズに達し、SignalSRを実行して動作を停止しました。
これは、リクエストWebフォーム(Azureバグのための長いポーリングを使用して)に表示されるものです。
transport longPolling
connectionId bbed6f35-8379-4be3-ac28-ef3e618382ae
connectionData [{"name":"jethub"}]
messageId 85
groups ["JetHub.f9f81bcc-8417-46bd-bae5-c4134972601d","JetHub.5139a8de-04c2-48da-9427-39666e52fabd","JetHub.6b12e333-4d22-47c3-8587-7a9ad5026184","JetHub.252ea279-7a71-40e7-b03c-7d63e69f07ab","JetHub.a4843a77-1e6d-4693-b3de-b392ef465410","JetHub.27feb53a-3c2d-4b11-92f7-dbdffb874b25","JetHub.8840dfcf-e6be-4b72-965b-b282a60446e8","JetHub.bf7d3301-6fc0-4499-bee8-fe22f1bc2281","JetHub.655cba0e-7f72-402c-b80b-dcb740546163","JetHub.85d817e2-67a3-4291-b564-5320598339f6","JetHub.e3079263-3f6e-4a54-ad88-0dfc5dd2ce18","JetHub.33f00a67-9b05-4293-8119-4617e2fed9b0","JetHub.6323cfe8-fb81-4716-b553-79b9d72641a5","JetHub.b4359f8a-030a-4ac9-aacd-c05b42163bcc", ... many more]
.
私はIISでクエリストリングサイズを増やすことができるが、グループを管理するためのより良い方法があるか、サーバーサイドのグループ化スキームを作成し、各クライアントに別々にブロードキャストする方法はありますか?永続的な接続はその点で役立ちますか?
ありがとう。
解決
GROUSSがSIGNESR 0.5.3のクエリ文字列を介して往復されているため、次のオプションがあります。 a)最大クエリ文字列サイズを大きくします b)より短いグループ名を使用してください c)サーバー上でグループ化し、各ユーザーに別々にブロードキャストします
PissistentConnectionsは、Hub APIがそれらの上に構築されているので、ここには役に立ちませんので、同じ問題に遭遇します。
他のヒント
これはすでにあなたの満足に答えられていることを知っていますが、各クライアントに個別にメッセージを送信せずにサーバー上のグループを管理する方法があります。あなたはあなた自身のhubdispatcherを実装することができます:
using System.Collections.Generic;
using SignalR;
using SignalR.Hubs;
namespace My.Hubs
{
public class MyHubDispatcher : HubDispatcher
{
public MyHubDispatcher() : base("/myhubs") { }
protected override Connection CreateConnection(string connectionId, IEnumerable<string> signals, IEnumerable<string> groups)
{
//ex: IEnumerable<string> myGroups = new string[] { "MyHub.MyGroup", "MyHub.MyOtherGroup", "MyOtherHub.MyGroup" };
IEnumerable<string> myGroups = GetGroups(connectionId);
return base.CreateConnection(connectionId, signals, myGroups);
}
}
}
.
その他のPersistentConnectionのようなルーティングを設定できます。
using System.Web;
using System.Web.Routing;
using SignalR;
namespace My
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801
public class Application : HttpApplication
{
protected void Application_Start()
{
RouteTable.Routes.MapConnection<Hubs.MyHubDispatcher>("myhubs", "myhubs/{*operation}");
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
}
}
.
それからあなたは通常あなたのようなハブのグループを使用することができます:
using SignalR.Hubs;
namespace My.Hubs
{
public class MyHub : Hub
{
public void AlertClients(string id, int duration)
{
Clients["MyGroup"].Alert("MyGroup");
Clients["MyOtherGroup"].Alert("MyOtherGroup");
}
}
}
.
JSクライアントを使用している場合は、~/myhubs/hubs
ではなく~/signalr/hubs
にスクリプトを含めることができます。new Client.Hubs.HubConnection("http://foo/myhubs", useDefaultUrl: false);
を使用してください.NETクライアントを使用している場合