使用 Azure 服务总线的 SignalR 横向扩展

作者 :Patrick Fletcher

警告

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

在本教程中,你将使用服务总线底板将 SignalR 应用程序部署到 Windows Azure Web 角色,以便将消息分发到每个角色实例。 (还可以将服务总线底板与 Azure 应用服务.) 中的 Web 应用配合使用

显示从主题到 Web 角色到计算机的箭头的示意图。标记为“发布”的箭头从“Web 角色”开始,然后转到“主题”。

先决条件:

  • 一个 Microsoft Azure 帐户。
  • Windows Azure SDK
  • Visual Studio 2012 或 2013。

服务总线底板还与 适用于 Windows Server 的服务总线版本 1.1 兼容。 但是,它与适用于 Windows Server 的服务总线版本 1.0 不兼容。

定价

服务总线底板使用主题发送消息。 有关最新定价信息,请参阅 服务总线。 撰写本文时,每月可以发送 1,000,000 条消息,且不超过 1 美元。 底板会针对每次调用 SignalR 中心方法发送服务总线消息。 还有一些用于连接、断开连接、加入或离开组等的控制消息。 在大多数应用程序中,大多数消息流量将是中心方法调用。

概述

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

  1. 使用 Windows Azure 门户创建新的服务总线命名空间。

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

  3. 创建 SignalR 应用程序。

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

    public void Configuration(IAppBuilder app)
    {
        string connectionString = "Service Bus connection string";
        GlobalHost.DependencyResolver.UseServiceBus(connectionString, "YourAppName");
    
        app.MapSignalR();
        // ...
    }
    

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

对于每个应用程序,为“YourAppName”选择不同的值。 不要在多个应用程序中使用相同的值。

创建 Azure 服务

创建云服务,如 如何创建和部署云服务中所述。 按照“如何:使用快速创建创建云服务”部分中的步骤进行操作。 在本教程中,无需上传证书。

选项“云服务”以红色圈圈的屏幕截图。

创建新的服务总线命名空间,如 如何使用服务总线主题/订阅中所述。 按照“创建服务命名空间”部分中的步骤进行操作。

标题为“添加新命名空间”的窗口的屏幕截图,其中包含以下选项。

注意

请确保为云服务和服务总线命名空间选择同一区域。

创建 Visual Studio 项目

启动 Visual Studio。 在“ 文件 ”菜单中,单击“ 新建项目”。

在“ 新建项目 ”对话框中,展开 “Visual C#”。 在 “已安装的模板”下,选择“ ”,然后选择“ Windows Azure 云服务”。 保持默认值 .NET Framework 4.5。 将应用程序命名为 ChatService,然后单击“ 确定”。

显示“新建项目”对话框的屏幕截图。在 Office Share Point 文件夹中选择了“云”。聊天服务位于“名称”字段中。

“新建 Windows Azure 云服务 ”对话框中,选择“ASP.NET Web 角色”。 单击) (> 右箭头按钮,将角色添加到解决方案。

将鼠标悬停在新角色上,使铅笔图标可见。 单击此图标可重命名角色。 将角色命名为“SignalRChat”,然后单击“ 确定”。

显示“新建 Windows Azure 云服务”对话框的屏幕截图。在 A S P.NET Web 角色上方键入了信号 R 聊天。

“新建 ASP.NET 项目 ”对话框中,选择“ MVC”,然后单击“确定”。

显示“新建 A S P 点 NET 项目”对话框的屏幕截图。M V C 是所选模板。

项目向导创建两个项目:

  • ChatService:此项目是 Windows Azure 应用程序。 它定义 Azure 角色和其他配置选项。
  • SignalRChat:此项目是 ASP.NET MVC 5 项目。

创建 SignalR 聊天应用程序

若要创建聊天应用程序,请按照使用 SignalR 和 MVC 5 入门教程中的步骤操作。

使用 NuGet 安装所需的库。 从 “工具 ”菜单中选择“ NuGet 包管理器”,然后选择“ 包管理器控制台”。 在 “包管理器控制台” 窗口中,输入以下命令:

Install-Package -ProjectName SignalRChat Microsoft.AspNet.SignalR
Install-Package -ProjectName SignalRChat Microsoft.AspNet.SignalR.ServiceBus

-ProjectName使用 选项将包安装到 ASP.NET MVC 项目,而不是 Windows Azure 项目。

配置底板

在应用程序的 Startup.cs 文件中,添加以下代码:

public void Configuration(IAppBuilder app)
{
    // Any connection or hub wire up and configuration should go here
    string connectionString = "";
    GlobalHost.DependencyResolver.UseServiceBus(connectionString, "Chat");  

    app.MapSignalR();
}

现在需要获取服务总线连接字符串。 在Azure 门户,选择创建的服务总线命名空间,然后单击“访问密钥”图标。

显示标记为“创建”的加号、标记为“访问密钥”的密钥和标记为“删除”的垃圾桶的屏幕截图。

将连接字符串复制到剪贴板,然后将其粘贴到 connectionString 变量中。

显示“访问密钥连接到命名空间”对话框的屏幕截图。

string connectionString = "Endpoint=sb://xxxx.servicebus.windows.net/;
SharedSecretIssuer=owner;SharedSecretValue=XXXXXXXX";

部署到 Azure

在解决方案资源管理器中,展开 ChatService 项目中的“角色”文件夹。

显示标题为“角色”的打开文件夹的屏幕截图。已选择“信号 R 聊天”。

右键单击 SignalRChat 角色,然后选择 “属性”。 选择“ 配置 ”选项卡。在 “实例” 下,选择“2”。 还可以将 VM 大小设置为 “特小”。

显示实例的屏幕截图。实例计数设置为 2,V M 大小设置为“特小”。

保存更改。

在解决方案资源管理器中,右键单击 ChatService 项目。 选择“发布”。

显示解决方案资源管理器的屏幕截图。在“聊天服务”上下文菜单中选择了“发布”。

如果这是你第一次发布到 Windows Azure,则必须下载凭据。 在 “发布 ”向导中,单击“登录以下载凭据”。 这会提示登录 Windows Azure 门户并下载发布设置文件。

显示“发布 Windows Azure 应用程序”对话框的屏幕截图。登录以红色圈出下载凭据。

单击“ 导入 ”并选择下载的发布设置文件。

单击“下一步” 。 在 “发布设置” 对话框中的“ 云服务”下,选择之前创建的云服务。

显示“Windows Azure 发布设置”页的屏幕截图。

单击“发布” 。 部署应用程序和启动 VM 可能需要几分钟时间。

现在,运行聊天应用程序时,角色实例使用服务总线主题通过Azure 服务总线进行通信。 主题是允许多个订阅者的消息队列。

底板会自动创建主题和订阅。 若要查看订阅和消息活动,请打开Azure 门户,选择服务总线命名空间,然后单击“主题”。

导航菜单的屏幕截图,其中选择了主题。

消息活动需要几分钟时间才会显示在仪表板中。

显示时间线上的订阅和消息活动图的屏幕截图。

SignalR 管理主题生存期。 只要部署了应用程序,就不要尝试手动删除主题或更改主题的设置。

疑难解答

System.InvalidOperationException“唯一支持的 IsolationLevel 是'IsolationLevel.Serializable'。”

如果操作的事务级别设置为 以外的 Serializable值,则会发生此错误。 验证是否未对其他事务级别执行任何操作。