SignalR 是否支持这种情况?
是的,它支持并且适用于实时通知。
您可以使用groups 将消息广播到指定的已连接客户端子集。但不要将组用于有意义的数据。
您可以track/map 连接的客户端,只需通过 connectionId/connectionIds 向特定用户/用户通知发送消息。
如果我们谈到性能,20000 个并发连接(我假设是并发的)确实很多。首先你应该 change IIS configuration 支持超过 5000 个并发请求。
你应该optimize signalr for performance。消息大小应该更小。每条消息应最大为 4 Kb(对于这么多的并发连接,我建议您使用更少)。
Signalr 使用Json,因此您可以使用JsonProperty 来减小消息大小。
[JsonProperty("op")]
public decimal OrderPrice
为什么邮件大小很重要?因为每个连接在服务器端都有一个缓冲区。如果客户端可以获得 1 条消息,但此时服务器发送了 2 条消息,则消息将被填充到缓冲区中。这些缓冲区使用内存。因此,您应该更加小心地处理 20000 个并发连接。否则你将遭受内存消耗。
但在你的情况下,消息大小是不够的,你应该减少这个缓冲区限制。
DefaultMessageBufferSize:默认情况下,SignalR 保留 1000 条消息
每个集线器每个连接的内存。如果正在使用大消息,这
可能会产生内存问题,可以通过减少这种情况来缓解
价值。可以在 Application_Start 事件处理程序中设置此设置
在 ASP.NET 应用程序中,或在 OWIN 的配置方法中
自托管应用程序中的启动类。以下示例
演示如何减少此值以减少内存
应用程序的占用空间,以减少服务器的数量
使用的内存:
public class Startup
{
public void Configuration(IAppBuilder app)
{
// Any connection or hub wire up and configuration should go here
GlobalHost.Configuration.DefaultMessageBufferSize = 500;
app.MapSignalR();
}
}
我建议你使用它 100。减少缓冲区限制有什么缺点?当缓冲区已满时,它不会收到任何新消息。这意味着客户端会丢失您的一些通知。因此,如果您的通知是事务性的(用户必须接收),请不要减少很多缓冲区大小。但如果没有,您可以减少(最低必须为 32)。
您应该在服务器端和客户端使用 net 4.5 或更高版本,并且您的客户端应该有 windows8 或更高版本以支持 websocket。
应用这些步骤后,按照您的内存消耗并更改消息大小/缓冲区限制/消息频率。
奖励: 20000 个并发请求太多了。因此,如果您遇到性能问题,我建议您使用负载均衡器/扩展和Signalr BackPlane。这样一来,您将没有 1 个 Web 服务器,比如说 4 个。每个服务器将有 5000 个并发请求(平均)。当您在服务器上发送一条消息时,其他服务器(也是它们的客户端)将通过背板获取消息。有什么缺点?您应该使用共享资源(例如:数据库)来跟踪/映射具有 connectionIds 的用户。