向用户发送与Facebook相同的关于新事件的通知's使用SignalR的通知

Sending Notification to the users about the new events same as Facebook's notifications using SignalR

本文关键字:通知 事件 SignalR 使用 于新 用户 Facebook      更新时间:2023-09-26

正如您在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对此问题的解决方案是什么?

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

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

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