可管控、不重复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。
相关推荐
金銀銅鐵1 小时前
浅解 Junit 4 第二篇: Runner 和 ParentRunner
java·junit·单元测试
_codemonster1 小时前
JavaWeb开发系列(七)表单开发
java
黎潇lulu2 小时前
Java运算符基础知识
java·开发语言
HAPPY酷2 小时前
C++中类常见的函数分类
java·开发语言·c++
小钻风33662 小时前
JWT初识
java·jwt·base64url
weixin_449173652 小时前
java使用poi保存表格和图片到word文件中
java·开发语言·word
好家伙VCC3 小时前
# 光计算驱动的编程范式革新:用Python实现光子神经网络模拟器在传统电子计算架构逼近物理极限的今天,**光计算**正
java·开发语言·python·神经网络
yqj2343 小时前
【无标题】
java·开发语言