Facebook の通知システムでわかるように、あなたの活動に関連する特定の変更が発生すると、Facebook はそれをあなたに通知します。重要な問題は、SignalR を使用して通知を送信する場合、次の 2 つの選択肢があることです。
- クライアント側を使用して、クライアントにメッセージをブロードキャストするサーバー メソッドを呼び出す
- サーバー側を使用して接続を開始し、次のようにクライアントにメッセージをブロードキャストするサーバー側でメソッドを呼び出します。
[HubName("messenger")] public class MessengerHub : Hub { /// <summary> /// Broads the cast message. /// </summary> /// <param name="message">The message.</param> public void BroadCastMessage(Object message, string group) { _messenger.BroadCastMessage(message, group); } }
ここでは、サーバーから通知ユーザーへの BroadCastMessage メソッドを呼び出します。
var connection = new HubConnection("http://localhost:21600/"); SignalRConsole.SignalR.MessengerHub.Message message = new SignalR.MessengerHub.Message(); message.Content = Console.ReadLine(); message.Duration = 500; var myHub = connection.CreateProxy("messenger"); connection.Start().Wait(); myHub.Invoke("broadCastMessage", myData); Console.ReadLine();
ここで、データベースの最後の変更に基づいてメッセージをユーザー通知としてブロードキャストする場合は、データベースを頻繁にチェックし、接続を開始してブロードキャスト メソッドを呼び出してユーザーに通知を送信する必要があります。継続的なチェックでは、次のように無限 while ループを使用しています。
> while (true){
> //Some codes for tracing the last changes in Database such as new related events
> if(CheckIfThereIsaNewEvent()){
> connection.Start().Wait();
> myHub.Invoke("broadCastMessage", myData);
}
> }
サーバーは継続的にメソッドを呼び出し、DataBase を新しいイベントに対してチェックし、膨大な数のクライアントにメッセージをブロードキャストする必要があるため、1 億人のユーザーがいる場合、このコーディング スタイルはひどいものになるはずです。サーバーに負荷がかかり、論理的ではありません。それで、これを行う本当の方法は何ですか?この問題に対する Facebook の解決策は何ですか?