返回

Skywalking 优化系列:毫秒级拓扑查询,打造高效可观测系统

数据库

Skywalking:毫秒级拓扑查询优化

背景

现代分布式系统中,服务之间的依赖关系错综复杂,绘制服务拓扑图至关重要,可帮助我们快速定位服务之间的调用关系,分析系统架构和性能瓶颈。Skywalking 作为一款优秀的分布式追踪系统,提供了强大的拓扑查询功能,但其查询耗时一直是用户关注的焦点。

优化方案

为了解决拓扑查询耗时问题,Skywalking 团队进行了深入的研究和优化,最终实现了从分钟级查询耗时到毫秒级的大幅提升。优化方案主要包括:

  • 数据预聚合: 减少网络开销和数据传输量,提升查询速度。
  • 拓扑缓存: 缓存查询结果,避免重复的数据处理,缩短查询耗时。
  • 并行处理: 充分利用多核 CPU 优势,加速拓扑查询。

优化效果

经过优化,Skywalking 拓扑查询耗时大幅缩短:

Skywalking 版本 查询耗时
8.4.0 60 秒
8.5.0 100 毫秒

代码示例

下面是一个 Skywalking 拓扑查询的代码示例:

import com.google.common.collect.ImmutableMap;
import io.opentracing.tag.Tags;
import java.util.Collections;
import java.util.Map;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
import org.apache.skywalking.apm.toolkit.trace.TraceId;

public class TraceSpanExample {

    public static void main(String[] args) {
        // 创建 Span
        TraceSpan span = new TraceSpan(TraceId.newTraceId(), 0);
        span.setOperationName("my-operation");

        // 设置标签
        span.tag(Tags.HTTP_METHOD.getKey(), "GET");
        span.tag(Tags.HTTP_URL.getKey(), "http://www.example.com");

        // 模拟调用
        try {
            System.out.println("模拟调用...");
        } catch (Exception e) {
            span.log(e);
        }

        // 关闭 Span
        span.finish();
    }

    private static class TraceSpan {

        private TraceId traceId;
        private long spanId;
        private String operationName;
        private Map<String, String> tags;

        public TraceSpan(TraceId traceId, long spanId) {
            this.traceId = traceId;
            this.spanId = spanId;
        }

        public void setOperationName(String operationName) {
            this.operationName = operationName;
        }

        public void tag(String key, String value) {
            if (tags == null) {
                tags = ImmutableMap.of();
            }
            tags = ImmutableMap.<String, String>builder().putAll(tags).put(key, value).build();
        }

        public void log(Exception e) {
            // 记录异常信息
        }

        public void finish() {
            // 将 Span 数据发送到 Skywalking Collector
            TraceContext.stopSpan(this);
        }
    }
}

通过这段代码,我们可以模拟一个请求的调用流程,并将跟踪信息发送到 Skywalking Collector。在 Skywalking 界面中,我们可以查看该请求的调用拓扑图。

总结

通过数据预聚合、拓扑缓存和并行处理等优化措施,Skywalking 8.5.0 版本实现了毫秒级拓扑查询,大大提升了系统的可观测性和效率。这对于大型分布式系统的运维和性能优化至关重要。未来,Skywalking 团队将继续致力于进一步优化拓扑查询功能,为用户提供更强大和高效的可观测解决方案。

常见问题解答

  1. 为什么拓扑查询耗时很重要?
    答:拓扑查询耗时直接影响到我们对系统调用关系的了解速度,耗时越长,定位问题就越慢。毫秒级拓扑查询优化可以帮助我们快速定位问题,提高系统运维效率。

  2. 数据预聚合是如何工作的?
    答:数据预聚合将原始数据聚合成更小、更易于处理的数据块,从而减少网络开销和数据传输量,提升查询速度。

  3. 拓扑缓存有什么好处?
    答:拓扑缓存将查询结果缓存起来,避免重复的数据处理,大大缩短后续查询耗时。

  4. 并行处理如何提升查询效率?
    答:并行处理将查询任务分解成多个子任务,分配给不同的 CPU 线程并行执行,充分利用多核 CPU 的优势,显著提升查询效率。

  5. Skywalking 的毫秒级拓扑查询优化给我带来了什么好处?
    答:毫秒级拓扑查询优化可以帮助你快速定位系统问题,缩短故障排除时间,提升系统可用性和性能。