0

Facebook の通知システムでわかるように、あなたの活動に関連する特定の変更が発生すると、Facebook はそれをあなたに通知します。重要な問題は、SignalR を使用して通知を送信する場合、次の 2 つの選択肢があることです。

  1. クライアント側を使用して、クライアントにメッセージをブロードキャストするサーバー メソッドを呼び出す
  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 の解決策は何ですか?

4

2 に答える 2

0

ここで、データベースの更新中にメッセージ ブロードキャストをトリガーできます。たとえば、以下のメソッドと db update メソッドがあります

[HubName("messenger")]
    public class MessengerHub : Hub
    {
         /// <summary>
        /// Broads the db update message.
        /// </summary>
        /// <param name="message">The message.</param>
        public void BroadCastDbUpdate(Bool IsDbUpdate, string changes)
        {
            _messenger.BroadCastMessage(IsDbUpdate, changes);
        }
    } 



public void DbUpdate()
            {
//Do your db update and call the broadcast method
                _messenger.BroadCastMessage(IsDbUpdate, changes);
            }
于 2013-07-08T06:28:19.070 に答える