使用 SQL Server 的 SignalR 横向扩展

作者 :Patrick Fletcher

警告

本文档不适用于最新版本的 SignalR。 查看 ASP.NET Core SignalR

本主题中使用的软件版本

本主题的早期版本

有关 SignalR 早期版本的信息,请参阅 SignalR 旧版本

问题和评论

请留下反馈,说明你如何喜欢本教程,以及我们可以在页面底部的评论中改进的内容。 如果你有与本教程不直接相关的问题,可以将其发布到 ASP.NET SignalR 论坛StackOverflow.com

在本教程中,你将使用 SQL Server 跨部署在两个单独的 IIS 实例中的 SignalR 应用程序分发消息。 也可以在单个测试计算机上运行本教程,但若要获得完整效果,需要将 SignalR 应用程序部署到两台或更多台服务器。 还必须在其中一台服务器上或单独的专用服务器上安装SQL Server。 另一个选项是在 Azure 上使用 VM 运行本教程。

显示从 S Q L 服务器到 V M 到计算机的箭头的关系图。一个标记为“更新”的箭头从 V M 开始,并转到 S Q L 服务器。

先决条件

Microsoft SQL Server 2005 或更高版本。 背板支持桌面版和服务器版SQL Server。 它不支持 SQL Server Compact Edition 或 Azure SQL Database。 (如果应用程序托管在 Azure 上,请考虑使用服务总线底板。)

概述

在进入详细教程之前,下面简要概述了你将执行的操作。

  1. 创建新的空数据库。 背板将在此数据库中创建必要的表。

  2. 将这些 NuGet 包添加到应用程序:

  3. 创建 SignalR 应用程序。

  4. 将以下代码添加到 Startup.cs 以配置背板:

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Any connection or hub wire up and configuration should go here
            string sqlConnectionString = "Connecton string to your SQL DB";
            GlobalHost.DependencyResolver.UseSqlServer(sqlConnectionString);
            app.MapSignalR();
        }
    }
    

    此代码使用 TableCountMaxQueueLength 的默认值配置背板。 有关更改这些值的信息,请参阅 SignalR 性能:横向扩展指标

配置数据库

确定应用程序是使用Windows 身份验证还是SQL Server身份验证来访问数据库。 无论如何,请确保数据库用户具有登录、创建架构和创建表的权限。

创建一个新数据库供底板使用。 可以为数据库指定任何名称。 无需在数据库中创建任何表;底板将创建必要的表。

“对象资源管理器”对话框的屏幕截图。已选择标记为“数据库”的文件夹。

启用 Service Broker

建议为背板数据库启用 Service Broker。 Service Broker 在 SQL Server 中为消息传送和排队提供本机支持,使背板可以更高效地接收更新。 (但是,背板也可在没有 Service Broker.)

若要检查 Service Broker 是否已启用,请在 sys.databases 目录视图中查询is_broker_enabled列。

SELECT [name], [service_broker_guid], [is_broker_enabled]
FROM [master].[sys].[databases]

显示 sys.databases 目录视图的窗口的屏幕截图。

若要启用 Service Broker,请使用以下 SQL 查询:

ALTER DATABASE YOUR_DATABASE SET ENABLE_BROKER

注意

如果此查询显示为死锁,请确保没有应用程序连接到 DB。

如果已启用跟踪,跟踪还将显示是否启用了 Service Broker。

创建 SignalR 应用程序

按照以下任一教程创建 SignalR 应用程序:

接下来,我们将修改聊天应用程序以支持使用SQL Server进行横向扩展。 首先,将 SignalR.SqlServer NuGet 包添加到项目。 在 Visual Studio 的“ 工具 ”菜单中,选择“ NuGet 包管理器”,然后选择“ 包管理器控制台”。 在“Package Manager Console”窗口中,输入以下命令:

Install-Package Microsoft.AspNet.SignalR.SqlServer

接下来,打开 Startup.cs 文件。 将以下代码添加到 Configure 方法中:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // Any connection or hub wire up and configuration should go here
        string sqlConnectionString = "Connecton string to your SQL DB";
        GlobalHost.DependencyResolver.UseSqlServer(sqlConnectionString);
        app.MapSignalR();
    }
}

部署和运行应用程序

准备 Windows Server 实例以部署 SignalR 应用程序。

添加 IIS 角色。 包括“应用程序开发”功能,包括 WebSocket 协议。

显示“添加角色和功能向导”对话框的屏幕截图。选择服务器角色和 WebSocket 协议。

还包括“管理工具”) 下列出的管理服务 (。

显示“添加角色和功能向导”对话框的屏幕截图。选择服务器角色和管理服务。

安装 Web 部署 3.0。 运行 IIS 管理器时,系统会提示你安装Microsoft Web 平台,也可以下载安装程序。 在平台安装程序中,搜索 Web 部署并安装 Web 部署 3.0

屏幕截图,其中在搜索结果中选择了 Web 部署 3 点 0。

检查 Web 管理服务是否正在运行。 如果没有,请启动服务。 (如果在 Windows 服务列表中看不到 Web 管理服务,请确保在添加 IIS 角色时安装了管理服务。)

最后,打开 TCP 端口 8172。 这是 Web 部署工具使用的端口。

现在,你已准备好将 Visual Studio 项目从开发计算机部署到服务器。 在“解决方案资源管理器”中,右键单击解决方案,然后单击“发布”。

有关 Web 部署的更详细文档,请参阅 适用于 Visual Studio 的 Web 部署内容映射和 ASP.NET

如果将应用程序部署到两个服务器,则可以在单独的浏览器窗口中打开每个实例,并看到它们都从另一个接收 SignalR 消息。 当然, (在生产环境中,这两个服务器将位于负载均衡器后面。)

打开的两个浏览器窗口的屏幕截图,其中显示了部署到两个服务器的应用程序。

运行应用程序后,可以看到 SignalR 已在数据库中自动创建表:

显示文件夹和文件的“对象资源管理器”对话框的屏幕截图。

SignalR 管理表。 只要部署了应用程序,就不要删除行、修改表等。