具有多个输出绑定的性能 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
大家好阅读本文的人,
我们在一个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