你好,所有读过这篇文章的人
我们在应用计划中的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%(我们进行了额外的扩展,因此我们可以控制它,但为什么会导致这种情况的原因如此多
答案 0 :(得分:1)
跟进发生的事情有点晚了
最后,我们发现发生了什么事 我们有几个应用计划实例 但是旧的监视解决方案显示了applan实例的总体cpu和内存平均值。
基本上,通过切换到较新的指标和Azure监控,我们能够深入研究应用计划的单独实例和功能实例。
我们发现某个函数的一个实例正常运行了其中的三个实例,但其中第三个函数崩溃了,它的内部应用程序池崩溃并消耗了所有被搁置的cpu功能,并且绝对没有执行任何操作。
我们重新启动了功能,所有问题都消失了。
仍然想知道我们代码中是否有某些东西使它无法通过 或天蓝色发生的事情使它发疯。
:-s
答案 1 :(得分:0)
在App服务计划下使用Azure Function时,必须注意性能参数(例如扩展)。您是否调查过您的函数没有过载?
另一方面,作为您设计的一部分,这种方法对我来说是错误的。有这么多的绑定可能会存在潜在的性能问题,如果将来您应该添加更多的绑定怎么办?如果您不执行任何操作,则不应该承担重定向邮件的开销。
事件网格
我们可以为此使用事件网格。基于主题,IoT中心将事件发布为主题,事件由订阅者使用(在您的案例中为其他事件中心)。您还将获得微计费(无服务器)和自动缩放的优势。 https://docs.microsoft.com/en-us/azure/event-grid/overview