SignalR用于跟踪在线用户和聊天

问题描述:

我们正在研究社交网络应用程序,并将实施几项新功能。 1.跟踪在线用户 2.聊天(一对一聊天和后来的群聊)SignalR用于跟踪在线用户和聊天

我已经看过SingalR,它似乎很有前途。我们正在使用ASP.NET MVC 3,并且正在考虑使用集线器。 我的问题首先是SignalR是否更好,而不是简单的轮询聊天?就可扩展性而言,什么会更好?我已经看到了其他的问题,但无法找到哪一个更好,就可扩展性而言。

第二个问题是,如果我们使用SignalR,我们可以使用它来跟踪在线用户。我们可以定期从每个客户端调用一个服务器端函数来表示“我在线”,而在集线器方法中,我们可以只设置数据库中的isOnline位。一旦客户端断开,我们可以取消设置。这工作或简单的投票在这里会更好吗?如果我们使用简单的轮询,我们如何将用户设置为离线?

+0

有关我们是否应该使用SignalR跟踪在线用户的帮助(或不是)?这是否会被过度杀死,因为这意味着需要维护更多的连接(如果我们跟踪在线用户),或者如果我们只为希望聊天的用户连接tot SignalR会更好。这会减少连接数量。为了跟踪在线用户,我们应该使用其他方式? – Gaurav 2012-03-13 13:11:39

我正在使用SignalR作为一种聊天架构。完美适用于我们的单一IIS服务器设置。像this

var clients = Hub.GetClients<Type of your hub here>(); 

Sclaing-out-SignalR

如果使用集线器,可以解决“我在网上”问题,通过查询连接的客户端,并从每个客户端请求的用户名: 在可扩展性检查。如果有任何连接丢失,则必须在数据库在线用户中找到该数据库,而不是该数据中心的更多客户端。

OR

另一种方法是在线设置用户从用户到轮毂的第一消息。 “你好,我在那里”。 并使用this solution

public class MyHub : Hub, IDisconnect 
{ 
    public Task Disconnect() 
    { 
     // Query the database to find the user by it's client id. 
     var user = db.Users.Where(u => u.ConnectionId == Context.ConnectionId); 
     return Clients.disconnected(user.Name); 
    } 
} 

要处理的断开事件。

希望我能给你一些想法。

+0

这与我在问题中提到的完全相同。调用集线器将用户设置为联机,然后实施IDisconnect以将用户设置为脱机。但是,我仍然想知道SignalR是否会比简单的轮询更好。最初,我们会从单个IIS开始,但我们可能不得不扩展到Web Farm(我知道目前不支持)。但仍然有一台服务器,我们希望有多少用户可以进行一对一聊天? – Gaurav 2012-03-11 21:06:29

由于涉及数据库连接的网络流量,SignalR比轮询要好。另外,考虑一下你将用于MVC项目的signalR版本,因为最新版本的signalR只支持.net 4.5。

至于连接的数量,它取决于你有多少内存和你在IIS中配置了多少连接。你可以在一个体面的钻机上轻松处理1000+。

与Tom的回答一样,您可以截取事件到集线器或更低的signalR接口以获取计数,断开和连接事件。