65.9K
CodeProject 正在变化。 阅读更多。
Home

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

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2018年12月28日

CPOL
viewsIcon

12765

在本文中,我们将介绍如何使用 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 连接的客户端。

概述

以下是所有组件如何协同工作。

  1. 在 Azure Cosmos DB 中创建或更新了一个文档。
  2. 更改或更新事件会自动记录在 Azure Cosmos DB 更改源中。
  3. 使用 Azure Cosmos DB 触发器,当事件出现在更改源中时,Azure Function 会被调用。
  4. 使用 SignalR Service 输出绑定,该函数将消息输出到 SignalR Service。
  5. 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 DBSignalR Service)以获取这些包的最新版本。目前(2018 年 9 月),SignalR Service 绑定处于公开预览阶段,但服务本身已正式发布。

同时确保这些应用设置已配置了相关的连接字符串:AzureWebJobsCosmosDBConnectionStringAzureSignalRConnectionString

函数本身非常简单。我们只是将更新的文档数组映射到 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 DBSignalR Service)以获取最新版本。目前(2018 年 9 月),SignalR Service 绑定处于公开预览阶段,但服务本身已正式发布。

同时确保这些应用设置已配置了每个服务的连接字符串:AzureWebJobsCosmosDBConnectionStringAzureSignalRConnectionString

我们要查看的函数是 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]。

© . All rights reserved.