知识卡片
消息ID的四段式设计:让全局唯一ID本身承载定位信息,支撑分布式调用链路串联
内容
CAT给每一条监控消息分配一个格式类似ShopWeb-0a010680-375030-2的唯一ID,这个ID本身并不是一串无意义的随机字符,而是被设计成四段有明确语义的结构:第一段是应用名(如shop-web);第二段是当前机器IP的16进制格式;第三段是当前时间除以小时得到的整点数;第四段是当前客户端在这个小时内的顺序递增号。这个设计带来两个关键价值:一是ID本身自带定位信息——不需要额外查表,只看ID就能知道这条消息来自哪个应用、哪台机器、发生在哪个小时;二是它天然支撑了分布式调用链路的串联——当A服务调用B服务时,A会先在本地生成一个Message-ID,在调用B的过程中把这个ID作为调用上下文的一部分传递给B,B在执行时会用A传过来的这个Message-ID作为自己这次操作对应的监控消息ID,而不是自己重新生成一个——这样一条横跨多个服务的调用链路上,所有相关的监控消息都能通过同一个(或者说是被传递下去的)Message-ID关联起来,故障排查时可以顺着这条ID一路追踪到调用链路上的每一个环节,而不需要事后靠时间戳、日志内容这类模糊线索去猜测哪些消息属于同一次调用。这个案例给出了一条ID设计的重要思路:一个ID除了满足”全局唯一”这个基本要求之外,如果能进一步把有价值的定位信息(来源、时间、机器)直接编码进ID的结构里,就能让ID本身成为一份自解释的索引,同时如果这个ID还能在跨服务调用时被主动传递、被下游复用,就能进一步承担起串联整条分布式调用链路的职责,这两点结合起来能显著降低故障排查时”从一堆分散的日志里拼凑出完整调用链路”的成本。
参考来源
- 位置:《高可用架构(第1卷)》第5章《运维保障》"5.2 深度剖析开源分布式监控CAT"节,"5.2.4 服务端设计"(源文件:_epub-src/OEBPS/Text/Chapter5_2_5.xhtml)
- 结论依据:原文说明"在分布式调用里,RPC消息串起来的问题,当A调用B的时候,在A这端生成一个Message-ID,在A调用B的过程中,将Message-ID作为调用传递到B端……CAT消息的Message-ID格式为ShopWeb-0a010680-375030-2……第1段是应用名……第2段是当前这台机器的IP……第3段……第4段的2表示当前这个客户端在当前小时的顺序递增号",直接支撑本卡片结论。
- 原始内容:当A调用B的时候,在A这端生成一个Message-ID,在A调用B的过程中,将Message-ID作为调用传递到B端,在B执行过程中,B用context传递的Message-ID来作为当前监控消息的Message-ID……CAT消息的Message-ID格式为ShopWeb-0a010680-375030-2,CAT消息一共分为4段。