可管控、不重复TraceId解决方案

一、名词解释
TraceId: 追踪Id,一般用在分布式系统中,用于标识一次完整请求的唯一id。在分布式系统中,由于每个服务,组件等都可能部署多台(用到分布式技术的基本也是大型系统),要确定一次请求经过了哪些服务,日志捞取,性能检测等等没有标识无异于大海捞针,这时候就需要一个唯一标识将整个链路串联起来,这就是TraceId。
扩展:

1.系统唯一中立标识

由于TraceId的粒度为每次请求,并且唯一不重复,也可以作为系统唯一中立通传标识,其他各种业务需要实现通传的功能时,可在此标识上扩展,如灰度标识等,以此标识为key,业务标识为value。

二、技术实现

前端及各端是业务起点,所以TraceId由前端及各端生成,后端管控验证(管控滥用,管控唯一,安全隔离)的要求。
1.生成算法

|--------------|----|---------------------|-------------------|
| 名称 | 长度 | 标识 | 说明 |
| 固定前缀 | 2 | KZ | 标识来源、系统等 |
| TIMESTAMP | 8 | DDHHMMSS(日时分秒) | 时间天然防重,后天校验时间间隔 |
| USER_ID_COMP | 10 | 用户ID压缩(SHA-256前10位) | 用户隔离,SHA算法脱敏,压缩 |
| RND | 4 | 随机数(0000-9999) | 再加防重盐值,一个用户一秒可能多个 |
| DEVICE_ID | 8 | 设备唯一号压缩(8位Hex) | 设备隔离,SHA算法脱敏,压缩 |
| CHK | 8 | 前序的SHA-256前8位校验码 | 对前面的参数加签,防篡改 |
| 总计 | 40 | | |

生成示例:KZ011130118j6k1lcg4z11151d6j77hvh8uk4n1s

2.后端校验算法
a.每次首次请求上报设备唯一号(DEVICE_ID),后端存储至退出(兜底12小时),后续请求每次延时存储。
b.每次请求的TraceId,后端收到请求校验TIMESTAMP,时间不能超过30秒,防止滥用。
c.每次请求的TraceId,后端收到请求校验DEVICE_ID和首次上报的
DEVICE_ID做对比,当天不能频繁变更。
d.每次请求的TraceId,后端收到校验CHK是否一致。

多次校验达到,可信、防重放、可校验可追溯、可管控、不可伪造的效果。

3.重复概率

在同一秒内,同一用户、同一设备产生 N 条 TraceId 时,重复概率由 4 位随机数决定:

  • 单条 TraceId 重复的概率:1 / 10⁴ = 0.0001
  • 当 N = 100 时,重复概率 ≈ C (100,2) / 10⁴ ≈ 0.495
  • 当 N = 50 时,重复概率 ≈ C (50,2) / 10⁴ ≈ 0.1225
  • 当 N ≤ 10 时,重复概率 ≤ 0.0045,可忽略不计

在跨用户、跨设备的大型系统中,同一秒内产生 10⁶ 条 TraceId:

  • 总组合数 ≈ 10²²,远大于 10⁶
  • 重复概率 ≈ 1 - (1 - 1/10²²)^(10⁶) ≈ 10⁻¹⁶,几乎为 0。
相关推荐
都叫我大帅哥26 分钟前
Spring @Transactional 注解完全指南
java·spring
Java成神之路-32 分钟前
G1 垃圾回收器 :SATB + TAMS核心机制深度解析
java·jvm
前端工作日常1 小时前
我学习到的JIT即时编译与机器码缓存失效
java·后端
带刺的坐椅1 小时前
Solon 的 10 种 HTTP 服务器:改一行依赖,换一个引擎
java·solon·jetty·undertow·mcp-server·htttp
xcLeigh2 小时前
Go入门:变量声明的五种方式详解
java·开发语言·golang
AI大模型-小华2 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
Mark_ZP3 小时前
【锁1】Synchronized vs ReentrantLock区别
java
立心者03 小时前
SpringBoot中使用TOTP实现MFA(多因素认证)
java·spring boot·后端
枕星而眠3 小时前
C++ STL Map容器完全指南:从有序红黑树到无序哈希表
java·开发语言
逃逸线LOF4 小时前
Spring配置数据源{连接池}(Druid、c3p0)
java·数据库·spring