【问题标题】:Pushing message to multiple clients through SignalR通过 SignalR 向多个客户端推送消息
【发布时间】:2015-03-03 09:00:17
【问题描述】:

我有一个聊天应用程序,我必须在该应用程序中向该对话中的所有其他用户推送消息,当我将消息推送给超过 100 个的所有客户端时,信号器工作正常,但是当我遍历这 100 个连接并单独发送消息时消息在客户端接收缓慢,当我开始更快地推送消息时,我的服务器 IIS 工作人员会达到 100% 的 CPU 使用率,并且在客户端接收消息变得更慢,

所以请帮助我找到同时从 100 多个用户的信号器向特定用户发送消息的最佳方式

【问题讨论】:

  • 将调试器附加到进程并找出发生了什么(可能是无限循环?)。 SignalR 应该能够轻松处理超过 1000 个连接。
  • 代码执行顺利,但我的 iis 会以 100% cpu 使用率将消息一一缓慢地推送给客户端,顺便说一下,我的服务器配置是 windows server 2012,8gb ram,Xeon(R) 2.2 ghz,还好吗?
  • 100% cpu 使用率表示其中一个线程存在无限紧密循环。由于您的处理器有多个内核,它仍在进行一些处理(因此响应被推送到客户端),但是由于紧密的循环正在窃取资源,它发生的速度要慢得多。恕我直言,解决 100% cpu 使用率是这里的关键。
  • 我发现问题出在redis背板,当我移除redis用作背板时它工作正常,你有什么想法吗,我需要使用redis,因为我必须使用多台机器
  • Redis 背板最近已从 BookSleeve 迁移到 StackExchange.Redis,但尚未发货。您可以尝试从myget.org/gallery/aspnetwebstacknightly 构建 SignalR 2.2.0 和 Redis 背板的夜间版本,看看是否有帮助?或者,您可以等待 2.2.0 - 应该不会太久。

标签: signalr


【解决方案1】:

如果是聊天应用程序,您可能需要查看groups in SignalR。只需为每个“对话”创建一个新组,然后将用户加入该组。

来自文档:

public class ContosoChatHub : Hub
{
    public Task JoinRoom(string roomName)
    {
        return Groups.Add(Context.ConnectionId, roomName);
    }

    public Task LeaveRoom(string roomName)
    {
        return Groups.Remove(Context.ConnectionId, roomName);
    }
}

然后您可以简单地向群组发送消息:

Clients.Group(groupName).addChatMessage(name, message);

【讨论】:

  • 在我的情况下,我根据某些要求为该对话中的所有其他用户生成单独的消息,为此我无法将相同的消息推送给该对话中的所有用户,还有什么我可以试试?
  • 你能告诉我 SignalR 是否有能力一次向大约 200 个客户单独发送消息?我的服务器配置是 windows server 2012, 8gb ram, Xeon(R) 2.2 ghz 我问这个是因为如果我为信号器组实现了一些方法,但如果有 100 个对话有 2 到 3 个用户并且所有这些用户只是同时推送消息,然后它的行为方式与现在相同
猜你喜欢
  • 2015-01-12
  • 2022-10-22
  • 2016-09-19
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
  • 2012-01-18
  • 1970-01-01
  • 2012-03-10
相关资源
最近更新 更多