SignalR 是 Microsoft 开发的一个库,用于 ASP.NET 开发人员实现实时 web 功能。这意味着服务端代码可以实时地推送内容到连接的客户端,而不需要客户端定期请求或轮询服务器以获取新数据。SignalR 可以用于各种应用程序,如实时聊天、通知、实时数据更新等。
SignalR 提供了以下特点:
抽象层的连接:SignalR 提供了一种高级API,隐藏了底层实时通讯的复杂性。开发者不需要担心具体使用 WebSockets、Server-Sent Events、长轮询等,因为 SignalR 会根据客户端和服务器的能力自动选择最佳的通讯方式。
连接管理:自动处理连接、重连和断开连接的复杂性。
组播:可以广播消息到所有连接的客户端,或者只给特定的客户端或客户端组发送消息。
扩展性:支持可插拔的组件,允许开发者自定义或扩展其功能。
跨平台:除了在网页客户端上使用,还提供了客户端库支持各种平台,如 .NET、JavaScript、Java、Swift 和 Objective-C 等。
要使用 SignalR,开发者需要安装相应的 NuGet 包并按照文档中的指导进行配置和开发。
在近几年,SignalR 核心 (SignalR Core) 成为了主流,它是为 .NET Core 重新设计和实现的 SignalR 版本,提供了更好的性能和跨平台支持。
MessagePack
是一种快速而紧凑的二进制序列化格式。 当担忧性能和带宽问题时,这很有用,因为它创建的消息比 JSON 创建的小。 查看网络跟踪和日志时,二进制消息不可读取,除非这些字节是通过 MessagePack 分析器传递的。 SignalR 为 MessagePack 格式提供内置支持,并提供 API 供客户端和服务器使用。
若要在服务器上启用 MessagePack 中心协议,请在应用中安装 Microsoft.AspNetCore.SignalR.Protocols.MessagePack
包。 在 Startup.ConfigureServices
方法中,将 AddMessagePackProtocol
添加到 AddSignalR
调用以在服务器上启用 MessagePack 支持。
services.AddSignalR()
.AddMessagePackProtocol();
:::info 小知识
JSON 默认启用。 添加 MessagePack 可同时支持 JSON 和 MessagePack 客户端。
:::
当启用了MessagePack
,客户端会发送协议消息和版本
{"protocol":"messagepack","version":1}
后续会使用二进制传输,
:::tip 小知识
MessagePack在序列化中对比json序列化性能更好,并且体积更小,所以用于作为消息传输再合适不过了,但它不适合作为可读性的格式,所以在某些不需要可读性,需要性能的场景更合适。
:::
横向扩展(Horizontally Scaling),也常称为“扩展出”或“扩展宽”,是一种增加系统容量的方法,通过在现有的硬件集群中添加更多的机器或节点来实现。与之相对的是纵向扩展(Vertically Scaling)或称为“扩展高”,它涉及增加单一机器的资源,如CPU、RAM或存储。
横向扩展的主要特点和优势:
总的来说,当我们的单体服务器无法支撑我们现有用户的时候,只需要在添加节点便可支持更多用户。但是横向扩展也一样会有缺点,
由于一个服务器的资源是有限的,虽然说在使用的时候并没有达到硬件的上线但也存在Tcp连接数的限制,以下是官方介绍
Web 服务器可以支持的并发 TCP 连接数受到限制。 标准 HTTP 客户端使用临时连接。 这些连接可以在客户端进入空闲状态时关闭,并在以后重新打开。 另一方面,SignalR 连接是持久性的。 SignalR 连接即使在客户端进入空闲状态时也保持打开状态。 在为许多客户端提供服务的高流量应用中,这些持久性连接可能会导致服务器达到其最大连接数。
持久性连接还会占用一些额外内存来跟踪每个连接。
SignalR 大量使用连接相关资源可能会影响在同一服务器上托管的其他 Web 应用。 SignalR 打开并保持最后一个可用 TCP 连接时,同一服务器上其他 Web 应用也不再有可用连接。
如果服务器的连接用完,则你会看到随机套接字错误和连接重置错误。 例如:
复制
An attempt was made to access a socket in a way forbidden by its access permissions...
若要防止 SignalR 资源使用在其他 Web 应用中导致错误,请在与其他 Web 应用不同的服务器上运行 SignalR。
若要防止 SignalR 资源使用在 SignalR 应用中导致错误,请横向扩展以限制服务器必须处理的连接数。
SignalR 通过一种称为“后端”或“后台”存储的机制实现横向扩展。在 SignalR 中,为了支持跨多个服务器或节点的连接和消息传递,需要一个中心的后台存储来确保消息在所有服务器之间都能正确地传递。
以下是 SignalR 实现横向扩展的几种常见方式:
当 SignalR 使用后端存储进行横向扩展时,以下几点是需要考虑的:
SignalR 使用 Redis 作为后端存储来实现横向扩展的方式是基于 Redis 的发布/订阅 (pub/sub) 功能。这使得在多个 SignalR 服务器实例之间同步和传递消息成为可能。以下是 SignalR 如何使用 Redis 实现横向扩展的过程:
要使用 Redis 作为 SignalR 的后端存储,开发者需要安装相应的 SignalR Redis 包,并在应用程序的配置中指定 Redis 作为后端存储。
总的来说,通过使用 Redis 的发布/订阅功能,SignalR 能够在多个服务器实例之间同步和传递消息,从而实现横向扩展。
SignalR 使用 SQL Server 作为后端来实现横向扩展主要是通过 SQL Server 的消息队列功能,特别是 SQL Server 的 Service Broker。以下是 SignalR 使用 SQL Server 进行横向扩展的基本原理:
要使用 SQL Server 作为 SignalR 的后端进行横向扩展,需要进行一些配置:
Microsoft.AspNet.SignalR.SqlServer
。尽管 SQL Server 可以作为 SignalR 的后端,并提供了持久化和横向扩展的能力,但使用它可能会引入一些性能考虑。例如,与内存中的解决方案(如 Redis)相比,使用 SQL Server 可能会导致更高的延迟。此外,还需要确保 SQL Server 自身具有足够的性能和资源来处理大量的 SignalR 消息流量。
一个基于.NET 7实现新版本QQ UI
单机支持十万人的在线Chat
技术交流群:737776595
Gitee开源:https://gitee.com/hejiale010426/chat
GitHub开源:https://github.com/239573049/chat
项目文档: https://116.196.96.91/docs/intro
提供Asp.NET Core相关知识文档讲解