Jaeger 与 Zipkin 模型差异

解读

国内一线互联网公司在做 PHP 微服务治理时,几乎都会把分布式链路追踪列为“高可用三件套”之一(日志、监控、追踪)。面试现场问“Jaeger 与 Zipkin 模型差异”,表面是比较两个开源实现,实质是考察候选人是否真正在生产环境落地过追踪系统:有没有踩过协议不兼容的坑、有没有调优过采样率、有没有二次开发过探针。答得太浅(“一个是 Uber 的,一个是 Twitter 的”)会被直接打断;答得太偏(“Java 字节码插桩实现”)又会被质疑与 PHP 无关。因此,必须围绕“数据模型、传输协议、采样策略、存储选型、PHP 探针生态”五个维度,用中文技术关键词精准对比,再落回到 PHP-FPM + Swoole 场景如何选型。

知识点

  1. 数据模型

    • Zipkin 采用“Span 列表”模型:一个 Trace = 一棵树,树节点是 Span,Span 之间用 parentId 指向,Annotations 存时间戳事件。
    • Jaeger 采用“Span + References”模型:支持多父 Span(follows-from 等),内部仍兼容 Zipkin 的 parentId,但多了 flags、logs、tags 一级字段,方便做火焰图聚合。
  2. 上下文传播协议

    • Zipkin 默认使用 B3(X-B3-TraceId、X-B3-SpanId、X-B3-Sampled),国内阿里、美团、拼多多网关层均强制 B3。
    • Jaeger 原生使用 Uber-trace-id(trace-id:span-id:parent-id:flags),但提供 jaeger-b3 插件做双向透传;在 PHP 端需通过 OpenTelemetry SDK 切换 Inject/Extract 格式。
  3. 采样策略

    • Zipkin 只有“边界采样”(head-based):在第一个 Span 决定是否采样,PHP 端一旦漏掉就无法补救。
    • Jaeger 支持远程控制采样率,PHP 探针可定时从 agent 拉取策略,实现“热点接口 100%、冷接口 0.1%”的精细化治理,国内直播电商大促常用。
  4. 存储与查询

    • Zipkin 官方推荐 Cassandra+ES 双写,国内小公司常用 MySQL,但 Trace 量大时会出现“分库分表”难题。
    • Jaeger 自带 Badger 嵌入式 KV,也可插拔 ClickHouse、Kafka+ES;在 PHP 场景下,若公司已有 ClickHouse 行为分析平台,直接复用一套集群即可。
  5. PHP 探针成熟度

    • Zipkin 的 PHP-brave 基于 FFI 扩展,需 PHP≥7.4,协程支持不完整。
    • Jaeger 的 opentelemetry-php 已进 CNCF 官方维护,支持 Swoole、ReactPHP、RoadRunner,可直接通过 Composer 引入,且与 Laravel Octane 无缝集成。

答案

“从模型层面看,Zipkin 用‘单父 Span 树’,Jaeger 用‘多引用有向无环图’,后者在描述 PHP 异步协程(Swoole\Coroutine\Http\Client 并行调用)时更精确。传输协议上,国内网关普遍只认 B3,因此无论选型谁,都必须在 PHP 端通过 OpenTelemetry 做双向透传,保证 trace-id 贯穿 Nginx→Gateway→PHP-FPM→Go 微服务。采样策略是最大差异:Zipkin 只能 head-based,大促期间想调低采样率必须改代码上线;Jaeger 支持远程动态采样,PHP 探针每分钟拉一次策略,对业务零侵入。存储方面,Zipkin 用 MySQL 容易成为瓶颈,Jaeger 可复用现有 ClickHouse,节省一半机器。综合 PHP 生态,jaeger-client-php 已进入 CNCF,Laravel、Hyperf 官方示例直接集成,而 Zipkin PHP 仍靠社区个人维护。因此,在国内高并发 PHP 项目中,我优先推 Jaeger,同时用 OpenTelemetry 统一暴露 B3,确保与老系统兼容。”

拓展思考

  1. 如果公司已有 Prometheus + Grafana,但追踪想上 Jaeger,如何把 Span 的 RED 指标(Rate、Error、Duration)写到同一套 Grafana 面板,实现“追踪—指标”联动?
  2. PHP 8.2 的 Fiber 与 Swoole 协程并存时,一个请求可能切换多个协程栈,如何在 Jaeger 里用“follows-from”引用还原真实调用链,避免“断链”假象?
  3. 国内数据合规要求 Trace 不能出境,若用 Jaeger Collector + Kafka 跨机房同步,如何对 trace-id 做分片加密,同时保证采样后的链路可在本地 ClickHouse 快速回放?