TraceId 生成规则

[TOC]

1. 背景介绍

在常用的日志系统中,都会生成一个唯一的标识,来标明本次请求的ID,所有具有一个实际业务含义的标识比UUID更加的具有可读性。

2. 实现说明

aaaaaaaatttttttttttttccccfpppp

TraceId的a段是8个字符的IP地址(IPv4的每个段用两位16进制数表示),t段是13个字符的生成TraceId的毫秒时间,c段是4位(1000-9999)的整数递增量。对于线上环境,a段IP地址使用的最前端负责生成TraceId的那台服务器的IP,使用a、t、c三段能从TraceId直接得到机器IP和生成时间,能够满足直接根据机器IP 扫描检索TraceId的需求;时间也有助于TraceId的分布足够分散的同时又可以按时间进行存储分区。c段的4位顺序数用于避免多线程并发时TraceId碰撞(可以保证在qps=9000000以下不碰撞)。a、t、c三段的TraceId是现在用的最多的方案,但这个方案并不完美,如果同一台机器上同时部署多个应用,就很容易出现TraceId碰撞的情况,为了支持多JVM实例环境,最新版的 TraceId 末尾又增加了一个扩展字符 f (一般用于排查问题,例如f 段是字符e,表示由nginx模块生成的TraceId)和进程号p段(用四位16进制数表示)。