具有多个输出绑定的Performance Azure功能

时间:2019-01-23 17:57:06

标签: performance azure azure-functions azure-iot-hub

你好,所有读过这篇文章的人

我们在应用计划中的azure上编写了路由器功能,用于接收来自iothub的消息 并根据消息类型将消息路由到另一个eventhub。

以前,我们在此函数中有6个对eventhub的绑定 最近,我们增加了3种消息类型,因此3种绑定了3种eventhub。

此功能未处理任何消息,但现在看到的是我们在路由功能上花费了16倍的时间。

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

我们正在运行azure函数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个绑定,消息以50ms的速度通过路由器功能 通过9个绑定,消息可以在800毫秒内通过路由器功能进行爬网

applan上的CPU也提高了30%(我们进行了额外的扩展,因此我们可以控制它,但为什么会导致这种情况的原因如此多

2 个答案:

答案 0 :(得分:1)

跟进发生的事情有点晚了

最后,我们发现发生了什么事 我们有几个应用计划实例 但是旧的监视解决方案显示了applan实例的总体cpu和内存平均值。

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

我们发现某个函数的一个实例正常运行了其中的三个实例,但其中第三个函数崩溃了,它的内部应用程序池崩溃并消耗了所有被搁置的cpu功能,并且绝对没有执行任何操作。

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

仍然想知道我们代码中是否有某些东西使它无法通过 或天蓝色发生的事情使它发疯。

:-s

答案 1 :(得分:0)

在App服务计划下使用Azure Function时,必须注意性能参数(例如扩展)。您是否调查过您的函数没有过载?

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

事件网格

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