我们使用客户端 SDK 中的标准接收器可扩展性将 Application Insights 生成的数据的副本发送到事件中心。我们遵循与默认接收器相同的批处理和压缩逻辑——而不是简单地将数据发送到事件中心端点。
因此,在接收数据的函数应用中,单个 EventHub 消息将包含一个带有多个遥测点的 JSON 流,使用 gzip 压缩。
我们需要反序列化流并根据遥测类型采取一些行动。我们将每秒接收大约 50k,因此性能很重要。
我注意到 SDK 正在使用Bond并定义了公共架构 - https://github.com/Microsoft/ApplicationInsights-aspnetcore/tree/develop/Schema/PublicSchema
我目前正在做类似的事情,
foreach (var eventHubMessage in messages)
{
// decompress the entire gzipped payload
var decompressedData = DeserializeCompressedStream(eventHubMessage.Body.Array);
// deframe the JSON stream into individual items, (e.g. data.Split(new[] { Environment.NewLine })
var payloadItems = decompressedData.Deframe();
foreach (var item in payloadItems){
// A standard JSON.NET conversion to get the item
Envelope telemetryItem = ItemConverter.CreateTelemetryFromPayloadItem(item);
// etc etc
}
}
这是可行的,但是使用 JSON.Net 在项目级别进行转换是这种规模的昂贵操作,并且会占用 CPU。
假设执行反序列化的应用程序可以访问这些类型,例如https://github.com/Microsoft/ApplicationInsights-aspnetcore/tree/develop/test/ApplicationInsightsTypes,那么使用反序列化 JSON 流的推荐和最有效的方法是什么债券定义?