具有多个输出绑定的性能 Azure 函数

Performance Azure function with multiple output bindings

大家好阅读本文的人,

我们在一个app plan中写了一个在azure上的router函数,可以从iothub接收消息 根据消息类型,我们将消息路由到另一个 eventhub。

之前我们在此函数中有 6 个到 eventhub 的绑定 最近我们又添加了 3 个消息类型,所以 3 个绑定到 3 个事件中心

此函数中没有处理消息,但我们现在看到的是我们在路由函数中花费了 16 倍的时间。

具有多个输出绑定是否存在性能问题。 我们没有看到传入消息的负载增加。

我们 运行 Azure Functions 1.0(运行时版本:1.0.12205.0 (~1))

问候本

路由功能的简化示例代码

public static class IotHubRouterFunction
{
    [FunctionName("IotHubRouterFunction")]
    public static void Run([EventHubTrigger("%iothub%", Connection = "IothubRouterListen")]EventData myEventHubData,
        [EventHub("%msg1-eventhub%", Connection = "msg1event")] ICollector<EventData> eventHub4Dmsg1Event,
        [EventHub("%msg2-eventhub%", Connection = "msg2event")] ICollector<EventData> eventHub4Dmsg2Event,
        [EventHub("%msg3-eventhub%", Connection = "msg3event")] ICollector<EventData> eventHub4Dmsg3Event,
        //...  like 6 more bindings like this
        ILogger logger
    )
    {
        try
        {
            var messageType = GetValue(myEventHubData.Properties, "type");

            // routing
            switch (messageType)
            {
                case "msg1event":
                {
                    eventHub4DevicesStatusChanged.Add(eventHub4Dmsg1Event);
                    break;
                }
                case "msg2event":
                {
                    eventHub4MeasurementLog.Add(eventHub4Dmsg2Event);
                    break;
                }
                case "msg3event":
                {
                    eventHub4DeviceDiscovered.Add(eventHub4Dmsg3Event);
                    break;
                }
                //6 more cases like this
                default:
                {
                    logger.LogError("Unrouteable message of type: {messageType}", messageType);
                    break;
                }
            }
        }
        catch (Exception ex)
        {
            //removed
        }
    }        
}

使用 6 个绑定,消息以 50 毫秒的速度通过路由器功能 使用 9 个绑定,消息以 800 毫秒的速度爬行通过路由器功能

CPU 在 applan 上也提高了 30%(我们扩展了额外的规模,所以我们控制住了它,但为什么这么多是造成这个的原因)

当您在应用服务计划下使用 Azure Function 时,您必须注意缩放等性能参数。您是否调查过您的函数没有超载?

另一方面,作为您设计的一部分,这种方法对我来说是错误的。有了这么多绑定,可能会出现潜在的性能问题,如果您将来要添加更多绑定怎么办?如果您不执行任何操作,那么您不应该承担重定向消息的开销。

事件网格

我们可以为此使用事件网格。基于主题,IoT 中心将事件发布到一个主题,并且在您的案例中其他事件中心的订阅者使用事件。您还可以利用小额计费(无服务器)和自动缩放。 https://docs.microsoft.com/en-us/azure/event-grid/overview

跟进发生的事情有点晚了

最后我们才知道是怎么回事 我们有几个应用计划实例 但是旧的监控解决方案显示了应用程序实例的 cpu 和内存的平均值。

基本上,通过切换到较新的指标和 Azure 监控,我们能够深入了解应用计划的单独实例和功能实例。

我们发现一个函数的一个实例是 运行 三倍于其中两个 norammly 但是第三个函数崩溃了它的内部应用程序池并消耗了它获得的所有 cpu 能量并且什么也没做。

我们重新启动了该功能,所有问题都消失了。

仍然想知道是不是我们的代码中的某些东西让它通过了屋顶 或者天蓝色发生的事情让它变得疯狂。

:-s