Dapper 模型:TraceId 与 SpanId 的传播之道
Dapper 模型 本文是分布式算法科普系列第七篇,也是收官之作。前面六篇从服务发现、共识、流控、事务、消息、负载均衡一路讲过来——现在整个分布式系统已经跑起来了。但最后一个问题:一个请求跨了十几个服务,慢了,到底是哪个服务慢了? 一、故事:Google 搜索到底慢在哪 2008 年前后,Google 的搜索基础设施已经是一个超级复杂的分布式系统——一个用户搜索请求从前端 Web 服务器进入后,要经过拼写检查、查询改写、广告检索、文档索引查询、图片搜索、个性化排序等几十个服务,每个服务又有数十到数百台机器。 问题来了——运维团队收到告警:“搜索延迟上涨了 200ms”。全链路跨了几十个服务,研发团队只能挨个翻日志、看监控、拍脑门猜测到底是哪个服务变慢了。运气不好的时候——一个延迟问题排查一天是常有的事,而且经验依赖极高——只有老员工大概知道"这种情况一般是索引服务慢了"。 2010 年,Google 发表了《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》技术报告,公布了他们内部从 2005 年就开始使用的分布式追踪系统。Dapper 的核心贡献不是工程实现,而是一个极其简洁的数据模型——用两个 ID 和一个父引用,就能还原出任意复杂度的调用链路。 这个模型后来成为所有现代分布式追踪系统的理论基础——Twitter 的 Zipkin(2012)、Uber 的 Jaeger(2017)、Apache SkyWalking(2015)、以及 OpenTelemetry 标准(2019),全部沿用了 Dapper 的 TraceId + SpanId 模型。 二、前置:没有追踪时,排查有多痛苦 先感受一下一个典型的微服务调用链: 用户点击"下单" → API Gateway(网关——接收HTTP请求) → OrderService(订单服务——创建订单) → InventoryService(库存服务——扣库存) → Redis(缓存——检查库存标记) → AccountService(账户服务——扣余额) → CouponService(优惠券服务——核销优惠券) → NotificationService(通知服务——发短信) 总共 7 个服务节点。如果用户反馈"下单等了 3 秒才成功"——研发需要翻 7 个服务的日志,靠时间戳手工对——“订单服务的这条日志是 14:03:52.123,库存服务好像对应的日志是 14:03:52.245……这两条是同一个请求吗?"——没人知道。 写过的都懂——凌晨三点被叫起来排查线上问题,对着七八个服务的日志靠 grep + 时间戳对,好不容易对出大概链路,发现只是 Redis 慢了一下。没有追踪系统的日子,就是这么过的。 ...
