使用 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]。