背景

排查问题,系统之间往往需要定位到同一个链路请求,因此需要链路追踪。

另外一些实时业务需要针对性监控时效性,并告警通知。

设计

要求

  • 需要提供全链路追踪id
  • 需要监控同步进度

实现

版本一

不跨系统的请求id,直接拦截器为请求生成uuid,并返回给到客户端,同时写到日志。

版本二

  1. 请求头获取请求id,不存在则生成
  2. 跨系统之间通过请求头传输
  3. 通过threadlocal绑定线程获取请求id,线程池时需要考虑线程复用和父子线程数据复制,使用阿里的开源threadlocal

告警

  • 通过提交sql,判断时间差值,并钉钉告警(数据库定时任务)
  • redis队列监控,定时获取队列长度
  • mq消息监控,通过消费组查询队列积压告警

扩展

threadLocal内存泄漏问题

一般使用threadLocal需要手动调用一下remove确保清除内存。

不然可能造成值内存泄漏,threalocal设计是一个类似map的结构,key和val都需要内存回收,如果val没有被置为null,可能在一些线程池场景,可达性分析还能追溯到引用链,造成无法回收内存。