全链路跟踪系统研究

64 阅读2分钟

整体思路
调用接口,服务返回任务id,然后写一个回调接口,根据回调的结果去落库
如果回调成功,直接落库,回调失败,再次调用这个接口,得到新的任务id,然后去数据库更新这个记录为新的任务id,如果重试三次失败,切换到另一个服务。同时调用邮件服务向公司发一封报警邮件

还有一种情况,是服务没有回调,所以当时是结合集合set写了一个定时任务,在发出请求后,将这个任务id放到set集合中,然后这个定时任务定时查一下这个是否成功,成功就从集合中移除,失败就发送报警邮件

当时是想用Reids配合队列的,但是觉得失败毕竟是少数就没有引入队列,过度的引入反而增加系统复杂度

因为我们任务量较少,主要是验证产品的MVP的,也没有使用redis,使用redis可以使用他的持久化机制

定时任务崩溃,可以会重复处理数据,增加没有必要的开销,所有做了任务处理的幂等性,就是一个操作无论执行多少次,结果都一致。

使用UPDATE ... WHERE语句,只有在音乐的url生成后或者有变化才去更新

考虑使用 OpenTelemetry 等工具,增强系统的可观测性,方便进行分布式链路追踪和性能分析


核心设计与实现(解决方案)

1. 异步回调处理机制

  • 双通道状态同步:主通道采用服务回调接口,备用通道通过定时任务轮询
  • 回调失败处理策略:
    • 三级阶梯重试:失败后生成新任务ID并更新数据库记录(UPDATE tasks SET task_id=? WHERE id=? AND status='pending'
    • 服务熔断机制:连续3次失败自动切换备用转码服务
    • 报警联动:通过邮件服务发送服务降级告警(SMTP+异步队列)

2. 兜底轮询方案

  • 轻量级任务追踪:采用内存Set暂存未完成任务ID(替代Redis方案)
  • 定时扫描策略:
    • 分片扫描:按时间窗口分批处理,避免全表扫描
    • 补偿机制:失败任务触发邮件报警+人工干预入口
    • 幂等保障:通过version字段实现乐观锁控制(UPDATE ... WHERE version=?

3. 可观测性增强

  • 全链路追踪:集成OpenTelemetry实现
    • 自定义Span记录关键操作(任务创建、回调处理、重试触发)
    • 通过Baggage传递业务标识(用户ID+任务批次)
    • 指标埋点:统计成功率(success_rate{service="transcode"} 0.95
  • 可视化看板:Grafana展示关键指标(P99延迟、服务切换次数)