背景
排查问题,系统之间往往需要定位到同一个链路请求,因此需要链路追踪。
另外一些实时业务需要针对性监控时效性,并告警通知。
设计
要求
- 需要提供全链路追踪id
- 需要监控同步进度
实现
版本一
不跨系统的请求id,直接拦截器为请求生成uuid,并返回给到客户端,同时写到日志。
版本二
- 请求头获取请求id,不存在则生成
- 跨系统之间通过请求头传输
- 通过threadlocal绑定线程获取请求id,线程池时需要考虑线程复用和父子线程数据复制,使用阿里的开源threadlocal
告警
- 通过提交sql,判断时间差值,并钉钉告警(数据库定时任务)
- redis队列监控,定时获取队列长度
- mq消息监控,通过消费组查询队列积压告警
扩展
threadLocal内存泄漏问题
一般使用threadLocal需要手动调用一下remove确保清除内存。
不然可能造成值内存泄漏,threalocal设计是一个类似map的结构,key和val都需要内存回收,如果val没有被置为null,可能在一些线程池场景,可达性分析还能追溯到引用链,造成无法回收内存。