摘要:如何为每一个请求分配一个在全集群范围内都唯一的,却又不想去实现一个复杂的集中式序列生成器呢这或许是个办法,但不觉得不太甘心么下面的这个方式可能可以帮到你自增,用于的生成过程启动加载时的时间戳,用于的生成过程本机地址,用于的生成过程规则将
如何为每一个web请求分配一个在全集群范围内都唯一的request id,却又不想去实现一个复杂的集中式id序列生成器呢?
UUID? 这或许是个办法,但不觉得不太甘心么?
下面的这个方式可能可以帮到你:
package test; import java.util.concurrent.atomic.AtomicLong; import test.LocalIpAddressUtil; public class UniqRequestIdGen { private static AtomicLong lastId = new AtomicLong(); // 自增id,用于requestId的生成过程 private static final long startTimeStamp = System.currentTimeMillis(); // 启动加载时的时间戳,用于requestId的生成过程 private static final String ip = LocalIpAddressUtil.resolveLocalAddress().getHostAddress(); // 本机ip地址,用于requestId的生成过程 public static void main(String[] args) { System.out.println(resolveReqId()); } private static String resolveReqId() { // 规则: hexIp(ip)base36(timestamp)-seq return hexIp(ip) + Long.toString(startTimeStamp, Character.MAX_RADIX) + "-" + lastId.incrementAndGet(); } // 将ip转换为定长8个字符的16进制表示形式:255.255.255.255 -> FFFFFFFF private static String hexIp(String ip) { StringBuilder sb = new StringBuilder(); for (String seg : ip.split(".")) { String h = Integer.toHexString(Integer.parseInt(seg)); if (h.length() == 1) sb.append("0"); sb.append(h); } return sb.toString(); } }
其思路在注释里已经解释清楚了:这个id包含了本机ip、本应用启动时的时间戳、本应用内部自增id这三个要素,并且以合适的转码方式组合而成,可以简单地做到全局唯一性
生成的唯一性requestId形如:0a11d448iaxk1z35-112
利用它不仅能唯一标识一个请求,还能通过它反查到具体的机器ip
(注:其中引用到的LocalIpAddressUtil参见文章:http://segmentfault.com/a/1190000002637818 )
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/64378.html
摘要:关于我为什么写这篇文章是因为今天在做订单模块的时候看到之前的上描述的年月日用户位企业位四位自增长数。背景对于其定订单的生成。个人的看法是主要是唯一,其他关于业务方面的不是太太重要。自增实现了用于将的值递增,并返回结果。 关于我为什么写这篇文章是因为今天在做订单模块的时候,看到之前的PRD上描述的年月日+用户id2位+企业id位+四位自增长数。然后竟被我反驳的突然改成了精确时间+4位自增...
摘要:原文地址唯一的生成并不是一件小事想说爱它也并不是像简单来一个这样一件容易的事为什么要唯一数据库的自增在分库的时候会是一场灾难假设分两个库因为每个库都会开始从开始自增届时系统中将会出现两个为的用户自增会暴露用户量或者其他业务量自增会让有心者 [原文地址:https://blog.ti-node.com/blog...] 唯一ID的生成并不是一件小事 , 想说爱它 , 也并不是像简单来一个...
摘要:为什么需要发号器在分布式系统中,经常需要对大量的数据消息请求等进行唯一标识,例如对于分布式系统,服务间相互调用需要唯一标识,调用链路分析,日志追踪的时候需要使用这个唯一标识。 原文链接:何晓东 博客 文章起源于 康神交流群的 panda大佬和boss li关于发号器的一些交流,特此感谢让我们学到了新知识。 为什么需要发号器 在分布式系统中,经常需要对大量的数据、消息、http 请求等进...
摘要:几乎所有的系统都存在生成唯一的需求,如用户账单等,由于系统通常是分布式架构,因而需要有合适的分布式生成方案。优势和数据库自增方案类似缺点同样仍然有性能上限,依赖数据库的可用性。使用时,可以使用具体的场景选择合适的方案。几乎所有的系统都存在生成唯一ID的需求,如用户ID、账单ID等,由于系统通常是分布式架构,因而需要有合适的分布式ID生成方案。常见的分布式唯一ID方法有(欢迎补充):时间戳数据...
阅读 1642·2021-10-29 13:11
阅读 783·2021-09-22 10:02
阅读 1664·2021-08-20 09:35
阅读 1532·2019-08-30 15:54
阅读 2437·2019-08-30 15:44
阅读 1334·2019-08-29 16:52
阅读 1071·2019-08-23 12:56
阅读 733·2019-08-22 15:16