可管控、不重复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。
相关推荐
_Evan_Yao1 小时前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
梓豪csd1 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
秋饼2 小时前
Spring AI 2.1 Message Parts 深度实战:推理签名回放与跨轮记忆持久化的源码级落地
java·ai·技术分享·后端开发
thefool1122662 小时前
TCP 1
java·1024程序员节
金銀銅鐵5 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
AI人工智能+电脑小能手5 小时前
一次请求打几个下游,这个Java并行任务工具类6个方法按序聚合
java·线程池·并发编程·1024程序员节·批量处理·并行任务
burg_xun6 小时前
【生命科学 Agent】推理平台(三)
人工智能·系统架构·1024程序员节
paopaokaka_luck7 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
2301_32241428047 小时前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis
考虑考虑8 小时前
JDK26的JEP 500属性
java·后端·java ee