2016-05-23 22 views
0

私たちのアプリケーションでは、ランダムな数のクライアントにプッシュ通知を送信する必要があります。 のメッセージが送信される直前まで、これらのユーザーの静的グループを作成する方法はありません。データは分類されており、特定のユーザーのみが見ることができるためです。SignalRはランダムな数のクライアントにメッセージを送信します

私たちはSignalRに通知を提供しようとしていますが、 "送信"方法を実装する最良の方法は何か疑問があります。

ランダムにグループ化された最大3000人のユーザーに約20件のメッセージを送信するための、最もスケーラブルでパフォーマンスの良いソリューションはどれですか。

クライアントメソッドを使用しますか?

APIにおける「クライアント」の方法は、各クライアントに送る接続ID

Clients.Clients(clientIds).NewMessage(message); 

のリストを受け入れ?動的グループを作成

Clients.Client(clientId).NewMessage(message); 

送信する直前にグループを作成できます。

var groupName = Guid.NewGuid().ToString(); 

foreach (var clientId in clientIds) 
{ 
    await Groups.Add(clientId, groupName); 
} 

Clients.Group(groupName).NewMessage(message); 
  • メッセージがグループに属しているすべてのクライアントに配信されたかどうかを知る方法はありますか?グループにメッセージを送信した後は、グループが1回だけ有効になるため、グループを削除する必要があります。

ありがとうございます。

答えて

1

パフォーマンスを向上させるために動的に作成されたグループを使用しますが、scaling outも表示されます。しかし、あなたはまだあなたのハブにtrack of the connections idを保持する必要があります。

docsによると、グループはそれがすべてのユーザーがある場合にのみ存在します:実際に

を、グループはあなたがGroups.Addへの呼び出しで その名前を指定する最初の時間を自動的に作成され、それはあなたの会員からの最後の接続 を削除すると削除されます。

残念ながら、SignalR does not guarantee the message delivery。このようなことを自分で実装することはできますが、ユーザーがメッセージを受け取るのを待つことはおすすめしません。


後で、グループを再利用するつもりはありませんので、それだけで一つのメッセージを届けるためにそれらを作成するためのオーバーヘッドとなり

を編集します。実際にメッセージをユーザーに送信する基準がない場合は、グループ化するのは無意味です。

あなたができる最も基本的なことは、各接続のループであり、その接続に送信するメッセージをランダムに選択することです。これはまた、スケールアウトが容易になります。

+0

答えていただきありがとうございます。グループに関しては、どの戦略をお勧めしますか?グループの再利用はありません。毎秒約20のグループを作成していますので、SignalRで非常に多くのグループを持つことによるパフォーマンスへの影響は大きいと思います。 – Paulo

+0

ハイパウロ。グループは、接続されていないときに削除されます。 –

+0

再びFlorinに感謝します。しかし、ユーザーのいずれかが常に接続されている場合、私はすべてのグループが永遠に生きるようにします。これがパフォーマンスに影響を与えるとは思わない? – Paulo

関連する問題