【发布时间】:2013-10-31 21:03:57
【问题描述】:
您可以在 Facebook 的通知系统中看到,当与您的活动相关的指定更改发生时,Facebook 会通知您。 重要的问题是,如果我们想使用 SignalR 发送通知,我们有两种选择:
- 使用客户端调用服务器方法广播一个 给客户的消息
- 使用服务器端启动连接并调用方法 向客户端广播消息的服务器端如下:
[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