从服务总线主题触发 Azure 函数而不使用代理连接

Trigger Azure Function from Service Bus topic without consuming Brokered Connections

所以,我正在分析使用函数来消费来自主题的服务总线消息是否可行。

我们选择的服务总线定价方案对每月 'Brokered connections'(最多 1000)的数量有限制。

我的理解是,在典型的使用场景下,consumer/listener/subscriber连接一个topic并保持连接状态,在很长一段时间内(一天,甚至一周)接收到多条消息而不会断开连接,并且这被计为 1 'brokered connection'。最后,您可以在单个代理连接上接收数千条消息。

这如何与 Azure 函数绑定一起使用?从我在文档中读到的,一个函数可以是空闲的(即不是 运行),所以它不能保持这个持久连接。

是否有单独的 Functions 组件来保持此连接处于活动状态以侦听传入消息?还是每次函数闲置然后重新启动时,我们都会为新的代理连接付费?

我附上了当前计划功能的屏幕截图: https://azure.microsoft.com/en-us/pricing/details/service-bus/

稍后在同一 link:


编辑

来自Docs

Service Bus charges for the peak number of concurrent brokered connections that exceed the included quantity (1,000 in the Standard tier). Peaks are measured on an hourly basis, prorated by dividing by 744 hours in a month, and added up over the monthly billing period. The included quantity (1,000 brokered connections per month) is applied at the end of the billing period against the sum of the prorated hourly peaks.

他们在最后一句话中特别提到了“每月 1,000 个代理连接”。

这是一个例子:

Each of 10,000 devices connects via a single AMQP connection, and receives commands from a Service Bus topic. The devices send telemetry events to an Event Hub. If all devices connect for 12 hours each day, the following connection charges apply (in addition to any other Service Bus topic charges): 10,000 connections * 12 hours * 31 days / 744 = 5,000 brokered connections. After the monthly allowance of 1,000 brokered connections, you would be charged for 4,000 brokered connections, at the rate of [=11=].03 per brokered connection, for a total of 0.

所以我猜所有这些都是针对 10,000 个订阅者在 12 小时内同时连接到该主题,如果他们每天连接 24 小时,那么将对 9,000 个代理连接收费(10,000 减去包含的 1,000)?

无论如何,我也在尝试验证是否可以使用函数进行持久连接(我听说它们可以使用 webjobs)。

Azure Functions 有一个单独的组件,称为 ScaleController,它可以 24/7 全天候监视服务总线的事件。

由于 Functions 中的底层 SB 消息接收器是在 WebJobs 中实现的,因此将有一个连接可以在 Function 实例的整个生命周期中检索多个消息,尽管由于其当前的限制,它正在传递这些消息一次一个到您的功能代码进行处理。

只有当您的功能代码实际运行时,您才需要付费。这里有一个 link 给你一个 ScaleController 的概览:https://docs.microsoft.com/en-us/azure/azure-functions/functions-scale#runtime-scaling

如果您预计负载相对较高,是否考虑过使用事件中心而不是服务总线? Azure Functions 中的 ServiceBus-Triggers 目前一次只能处理一条消息,这对于高负载场景来说不是最优的。这是一个用于跟踪此功能请求的 GitHub 问题:https://github.com/Azure/azure-webjobs-sdk/issues/1024

EventHub-Triggers 可以批量处理消息,这应该会让您在每次执行 Function 时物有所值。参见 https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-event-hubs