1

我们使用客户端 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 流的推荐和最有效的方法是什么债券定义?

4

1 回答 1

1

不幸的是,由于延迟反序列化中的问题,您无法反序列化整个信封:https ://github.com/Microsoft/bond/issues/96 。

因此,您需要以其他方式解析出baseData其他内容,然后将其传递给绑定反序列化器。或者也许只是使用一些 JSON 解析器将其解析为 JSON,就像我们在单元测试中所做的那样。

JsonReader reader = new JsonTextReader(new StringReader(Encoding.UTF8.GetString(b, 0, b.Length)));
reader.DateParseHandling = DateParseHandling.None;
JObject obj = JObject.Load(reader);
return obj.ToObject<AI.TelemetryItem<TelemetryDataType>>();

我无法评论最有效的方法,因为我不确定您的任务是什么。在某些情况下,最高效的方法是根本不反序列化整个有效负载。

于 2019-01-16T18:20:54.293 回答