使用 SignalR Service 和 Azure Functions 从 Azure Cosmos DB 广播实时更新





0/5 (0投票)
在本文中,我们将介绍如何使用 Azure Functions 和 SignalR Service 将 Azure Cosmos DB 中实时的文档更改广播到通过 WebSockets 连接的客户端。
Azure Cosmos DB 拥有一个很棒的 更改源功能,它可以跟踪集合中文档的创建和更新事件。应用程序(包括使用 Azure Functions 构建的无服务器应用程序)可以从更改源读取事件,并实时监听更改源上的新事件。
Azure SignalR Service 是一项托管服务,允许应用程序通过 WebSockets 和其他支持的传输方式将实时消息广播到许多已连接的客户端。
2018 年 9 月 24 日 - Azure SignalR Service 已正式发布!
在本文中,我们将介绍如何使用 Azure Functions 和 SignalR Service 将 Azure Cosmos DB 中实时的文档更改广播到通过 WebSockets 连接的客户端。
概述
以下是所有组件如何协同工作。
- 在 Azure Cosmos DB 中创建或更新了一个文档。
- 更改或更新事件会自动记录在 Azure Cosmos DB 更改源中。
- 使用 Azure Cosmos DB 触发器,当事件出现在更改源中时,Azure Function 会被调用。
- 使用 SignalR Service 输出绑定,该函数将消息输出到 SignalR Service。
- SignalR Service 通过 WebSockets 将消息发送给所有已连接的客户端。

SignalR 客户端 SDK 可用于 JavaScript 和 .NET Standard。Java 客户端也即将推出。在此项目中,我们将使用浏览器中的一个简单 Vue.js 应用。使用 .NET Standard SDK,我们还可以使用 .NET Framework 和 .NET Core 构建桌面应用程序,或使用 Xamarin 构建移动应用程序来接收 SignalR Service 的消息。
使用 Azure Functions 将 Azure Cosmos DB 更改源连接到 SignalR Service
我们首先介绍如何使用 JavaScript 实现 Azure Functions,然后介绍如何使用 C# 执行相同操作。Java 和 Python 对 Azure Functions 的支持即将推出。
我们将使用的示例是一个航空公司航班定价数据库。每个航班都是 Azure Cosmos DB 集合中的一个文档,数据中的任何更改都将实时反映在应用程序中。

JavaScript
完整的解决方案可以在此处找到。我们将重点介绍的主要是 OnDocumentsChanged 函数。
在 function.json 中,我们定义了两个绑定
- Azure Cosmos DB 触发器 - 当在 flights集合中检测到更改时,函数将被执行,并将更新的文档作为名为updatedFlights的参数传递。
- SignalR Service 输出绑定 - 该函数使用它将消息输出到名为 flights的 SignalR Service 中心。
{
  "disabled": false,
  "bindings": [
    {
      "type": "cosmosDBTrigger",
      "name": "updatedFlights",
      "direction": "in",
      "databaseName": "demo",
      "collectionName": "flights",
      "feedPollDelay": 1000
    },
    {
      "type": "signalR",
      "name": "signalRMessages",
      "hubName": "flights",
      "direction": "out"
    }
  ]
}
要使用 Azure Cosmos DB 和 SignalR Service 绑定,我们需要使用 Functions Core Tools CLI 安装它们
func extensions install -p Microsoft.Azure.WebJobs.Extensions.CosmosDB -v 3.0.1
func extensions install -p Microsoft.Azure.WebJobs.Extensions.SignalRService -v 1.0.0-preview1-10002请检查扩展(Azure Cosmos DB、SignalR Service)以获取这些包的最新版本。目前(2018 年 9 月),SignalR Service 绑定处于公开预览阶段,但服务本身已正式发布。
同时确保这些应用设置已配置了相关的连接字符串:
AzureWebJobsCosmosDBConnectionString和AzureSignalRConnectionString。
函数本身非常简单。我们只是将更新的文档数组映射到 SignalR Service 消息对象数组。我们的消息对象指示 SignalR Service 在每个客户端上调用 flightUpdated 方法,并将 Azure Cosmos DB 文档作为参数传递。SignalR Service 消息包含两个属性
- target- 要在每个客户端上调用的方法名称
- arguments- 要传递给方法的参数
module.exports = function (context, updatedFlights) {
  context.bindings.signalRMessages =
    updatedFlights.map(flight => ({
      target: 'flightUpdated',
      arguments: [flight]
    }));;
  context.done();
};
跳转到下一节,了解如何实现客户端 JavaScript。
C#
查看此解决方案,了解如何使用 C# 实现相同的功能。
要使用 Azure Cosmos DB 和 SignalR Service 绑定,我们需要通过 NuGet 安装它们
dotnet add package Microsoft.Azure.WebJobs.Extensions.CosmosDB --version 3.0.1
dotnet add package Microsoft.Azure.WebJobs.Extensions.SignalRService --version 1.0.0-preview1-10002请检查扩展 NuGet 包(Azure Cosmos DB、SignalR Service)以获取最新版本。目前(2018 年 9 月),SignalR Service 绑定处于公开预览阶段,但服务本身已正式发布。
同时确保这些应用设置已配置了每个服务的连接字符串:
AzureWebJobsCosmosDBConnectionString和AzureSignalRConnectionString。
我们要查看的函数是 OnDocumentsChanged
[FunctionName("OnDocumentsChanged")]
public static async Task Run(
  [CosmosDBTrigger("demo", "flights", ConnectionStringSetting = "AzureWebJobsCosmosDBConnectionString")]
    IEnumerable<object> updatedFlights,
  [SignalR(HubName = "flights")] IAsyncCollector<SignalRMessage> signalRMessages,
  ILogger log)
{
  foreach(var flight in updatedFlights)
  {
    await signalRMessages.AddAsync(new SignalRMessage
    {
      Target = "flightUpdated",
      Arguments = new[] { flight }
    });
  }
}
CosmosDBTrigger 属性正在监听名为 demo 的数据库中的 flights 集合中的更改。发生更改时,函数将被触发,更新后的文档列表将在 updatedFlights 参数中提供。
该函数使用 SignalR 输出绑定将消息输出到名为 flights 的 SignalR Service 中心。我们将调用每个已连接客户端上的一个名为 flightUpdated 的方法,并将更新后的文档作为参数传递。SignalR Service 消息包含两个属性
- Target- 要在每个客户端上调用的方法名称
- Arguments- 要传递给方法的参数
在浏览器中接收实时更新
JavaScript 和 C# 实现都会在每个客户端上调用 flightUpdated 方法。在客户端 JavaScript 中,为 flightUpdated 添加一个事件监听器
connection.on('flightUpdated', flightUpdated)
function flightUpdated(updatedFlight) {
  // update UI
}
要查看 flightUpdated 的主体和单页应用程序的其余部分,请查看 index.html。
这就是我们将 Azure Cosmos DB 中的更改广播到连接到 SignalR Service 的客户端所需的所有工作!
资源
源代码可在 GitHub 上找到。
Azure SignalR Service 已正式发布。通过阅读文档了解更多信息,并立即开始尝试!
查看这期 On .NET 节目,我们在其中演示了此应用程序 [19:35]。

