【问题标题】:Sending Notification to the users about the new events same as Facebook's notifications using SignalR使用 SignalR 向用户发送与 Facebook 通知相同的新事件通知
【发布时间】:2013-10-31 21:03:57
【问题描述】:

您可以在 Facebook 的通知系统中看到,当与您的活动相关的指定更改发生时,Facebook 会通知您。 重要的问题是,如果我们想使用 SignalR 发送通知,我们有两种选择:

  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);  
          }
>      }

当我们拥有一亿用户时,这种编码风格应该很糟糕,因为服务器应该不断调用一个方法并检查数据库是否有新的事件并向大量客户端广播消息,因此我们应该分配大量的计算和因此服务器上的负载很大,这不合逻辑。 那么,这样做的真正方法是什么? Facebook 对此问题的解决方案是什么?

【问题讨论】:

    标签: javascript asp.net facebook signalr


    【解决方案1】:

    这里我们可以在数据库更新时触发消息广播。例如我们有下面的方法和数据库更新方法

    [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);
                }
    

    【讨论】:

    • 谢谢.. 但也许在一段时间内facebook会有数百万的更新。然后,使用上面的代码,我们应该广播数百万条通知,然后检查该广播消息的所有者在客户端中。将更新后的事件发送到所有浏览器,然后在客户端检查其所有者是否合乎逻辑?
    • 我们可以根据您的要求扩展 SignalR。请查看此链接以了解扩展选项:stackoverflow.com/questions/11667799/…
    【解决方案2】:

    尝试使用 SqlDependency 类 OnChange 事件来触发 SignalR 方法。您可以指定应该在哪个查询上触发事件:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      相关资源
      最近更新 更多