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

Performance 具有多个输出绑定的性能Azure函数,performance,azure,azure-functions,azure-iot-hub,Performance,Azure,Azure Functions,Azure Iot Hub,大家好,读过这篇文章的人 我们已经在azure上的应用程序计划中编写了一个路由器功能,用于接收来自iothub的消息 根据消息类型,我们将消息路由到另一个eventhub 在此之前,我们在此函数中有6个到eventhubs的out绑定 最近,我们又添加了3种消息类型,因此又增加了3种外绑定到3种EventHub 在这个函数中没有消息处理,但我们现在看到的是,我们在路由函数中花费的时间是原来的16倍 具有多个输出绑定是否存在性能问题。 我们并没有看到传入消息的负载增加 我们运行的是azure fu

大家好,读过这篇文章的人

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

在此之前,我们在此函数中有6个到eventhubs的out绑定 最近,我们又添加了3种消息类型,因此又增加了3种外绑定到3种EventHub

在这个函数中没有消息处理,但我们现在看到的是,我们在路由函数中花费的时间是原来的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
        }
    }        
}
公共静态类IoTubRouterFunction
{
[函数名(“IoTubRouterFunction”)]
公共静态无效运行([EventHubTrigger(“%iothub%”,Connection=“IothubRouterListen”)]EventData MyEventThubData,
[EventHub(“%msg1 EventHub%”,Connection=“msg1event”)]ICollector eventHub4Dmsg1Event,
[EventHub(“%msg2 EventHub%”,Connection=“msg2event”)]ICollector eventHub4Dmsg2Event,
[EventHub(“%msg3 EventHub%”,Connection=“msg3event”)]ICollector eventHub4Dmsg3Event,
//…像这样的绑定还有6个吗
ILogger记录器
)
{
尝试
{
var messageType=GetValue(myEventHubData.Properties,“type”);
//路由
开关(消息类型)
{
案例“msg1event”:
{
EventHub4DeviceStatusChanged.Add(eventHub4Dmsg1Event);
打破
}
案例“msg2event”:
{
eventHub4MeasurementLog.Add(eventHub4Dmsg2Event);
打破
}
案例“msg3event”:
{
eventHub4DeviceDiscovered.Add(eventHub4Dmsg3Event);
打破
}
//还有6个这样的案子
违约:
{
LogError(“类型为{messageType},messageType的不可路由消息”);
打破
}
}
}
捕获(例外情况除外)
{
//除去
}
}        
}
通过6个绑定,消息以50ms的速度通过路由器功能 通过9个绑定,消息以800ms的速度通过路由器功能爬网


在applan上,CPU也提高了30%(我们额外扩展了,所以我们可以控制它,但为什么会有这么多的原因)

当您在应用服务计划下使用Azure功能时,您必须注意性能参数,如扩展。你调查过你的函数没有过载吗

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

事件网格


我们可以使用事件网格。基于主题,IoT中心将事件发布到主题,并且在您的情况下,订阅者使用其他事件中心的事件。您还可以利用微计费(无服务器)和自动缩放功能

对所发生的事情进行跟踪有点晚了

最后我们发现了到底发生了什么 我们有几个应用程序计划的实例 但是旧的监控解决方案显示了整个applan实例的cpu和内存的平均值

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

我们发现,一个函数的一个实例运行了三次,其中两次是norammly,但第三个函数崩溃了它的内部应用程序池,并消耗了所有的cpu功率,它被延迟了,什么也没做

我们重新启动了函数,所有问题都解决了

还想知道我们的代码中是否有什么东西让它通过了屋顶 或者在azure中发生的事情让它变得疯狂


:-s

否系统没有过载,负载没有增加。当我们启动此解决方案时,事件网格不可用。microsoft顾问验证了此方法。我们计划以这种方式路由50多种不同类型的消息。我想知道为什么您会说“有这么多绑定,可能会有潜在的性能问题”。因为这是我的问题,添加这么多绑定是否会影响性能以及原因。因为这意味着我们是非常不明智的。Eventgrid已经在雷达上了,但我们不能在当前的生产设置中直接推出,因为产品正在运行和工作,但通过添加额外的绑定似乎有不错的性能。开箱即用的解决方案应该可以,但当我说可能有问题时,我想你是根据您的自定义代码重定向,这可能会有一些问题,如阻止调用等。您实际上是如何重定向它们的?你们能分享代码样本吗?你提到的延误太大了。还可以分享一些数字,比如以秒为单位处理所需的时间和多少条消息。我对分享代码表示感谢。看这个,我找不到这么多耽搁的原因。我想你应该更深入地了解日志中正在发生的事情。如果您还没有,我建议您使用“应用程序洞察”深入了解功能并分享您的结果。