Page 377 - 《软件学报》2025年第9期
P. 377
4288 软件学报 2025 年第 36 卷第 9 期
则来解析日志, 并将剩余的部分作为日志的模板. 不同于上述的压缩方法, Ding 等人 [40] 将日志冗余提取方法和基
于神经网络的压缩方法相结合, 建立了一个高效的日志存储系统. Li 等人 [41] 通过最长公共子序列和基于熵的方法
识别日志数据中的共性和可变性, 并基于此设计了多种编码规则, 从而用更短的形式表示日志数据.
目前, 对压缩数据进行查询的方法 [39,42−45] 主要分为两种: 直接在压缩的数据上查询而无需解压, 以及划分数据
并在查询时过滤无关单元. 第 1 种方式通常需要对数据建立索引, 这将带来额外的存储开销. Agarwal 等人 [42] 提出
了一种熵压缩的方法, 将部分信息嵌入到压缩数据中, 以减少索引的存储大小. Pibiri 等人 [43] 将基于字典的技术应
用于倒排索引的压缩, 以实现压缩比和压缩效率之间的平衡. Zhang 等人 [44] 基于 Sequitur 实现了一种分层压缩算
法, 可以避免不必要的重复处理. 第二种方式可以采用高压缩比的压缩方法, 但查询效率会略微降低. Rodrigues 等
人 [39] 通过将日志处理为格式整齐的模板和参数, 实现了对压缩数据的快速查询. Wei 等人 [45] 则将日志参数进一步
细分为更小的单元, 能够更加精细地筛选出符合要求的日志, 减少解压数据量.
现有的方法主要是针对普通文本和日志数据进行设计的. 而分布式追踪数据由跨度组成, 且跨度可以构成反
映请求在系统中执行过程的调用链, 这与普通文本数据和日志数据都存在较大的区别. 同时, 在对分布式追踪数据
进行压缩时, 需要考虑分布式追踪数据中的模式冗余 (不同跨度间重复的键值对) 和结构冗余 (不同调用链间重复
的调用结构), 这样才能实现分布式追踪数据的高效压缩. 因此, 本文提出了基于神经网络的分布式追踪数据压缩
和查询方法, 通过识别分布式追踪数据中的模式冗余和结构冗余, 实现了对追踪数据的高效压缩, 并且能够在不引
入额外存储开销的情况下实现对已压缩追踪数据的复杂查询.
2 基础知识
本文针对分布式追踪数据提出了一种压缩和查询的方法, 下面就相关概念和基本知识予以介绍.
2.1 分布式追踪背景知识
分布式追踪记录了请求在多服务架构中传播所采用的路径, 是微服务基础设施的重要组成部分. 目前, 针对微
服务的分布式追踪已经有多种实现方式, 例如 Zipkin、Jaeger 和 OpenTelemetry 等. 虽然不同工具产生的追踪数据
在格式上不完全相同, 但在数据模型上基本上都由追踪、跨度和跨度上下文这 3 个核心概念组成. 追踪表示一次
请求的追踪过程, 代表了一次请求的完整请求链路, 使用唯一的追踪标识符标识. 跨度是调用链中的基本组成, 表
示系统中具有开始时间和执行时长的逻辑单元. 每个跨度都封装了多种状态, 包括时间戳、关联事件以及标签信
息等. 跨度上下文涵盖了追踪中标识跨度的所有信息, 且随请求传播到子跨度, 是支撑分布式追踪的关键. 跨度上
下文包含了从父跨度传播到子跨度的追踪标识符、跨度标识符和选项等, 子跨度利用这些信息构建服务间的调用
关系. 如图 1 所示, 追踪由树形结构的一组跨度组成, 每个跨度对应一个服务调用. 除了根跨度以外, 每个跨度都有
一个父跨度, 它可以开启当前跨度. 例如, 在图 1 中, 跨度 A 是一个同步调用, 在执行过程中分别开启了跨度 B 和
跨度 E 两个子跨度, 因此跨度 A 是跨度 B 和跨度 E 的父跨度. 跨度上下文信息随着服务调用从跨度 A 向下传播,
用于在子跨度中生成追踪 ID 和父跨度 ID.
时间
唯一 ID 跨度上下文
A
A
跨度上下文 跨度上下文 B
追踪
C 跨度
B E
D
跨度上下文 跨度上下文
E
C D
(a) 调用关系 (b) 跨度的时间轴
图 1 分布式追踪的调用链

