资讯专栏INFORMATION COLUMN

分享代码片段:web集群全局唯一request id生成算法, 替代uuid等“通用”方案

daryl / 2686人阅读

摘要:如何为每一个请求分配一个在全集群范围内都唯一的,却又不想去实现一个复杂的集中式序列生成器呢这或许是个办法,但不觉得不太甘心么下面的这个方式可能可以帮到你自增,用于的生成过程启动加载时的时间戳,用于的生成过程本机地址,用于的生成过程规则将

如何为每一个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位自增...

    omgdog 评论0 收藏0
  • php与唯一ID生成的相关事宜

    摘要:原文地址唯一的生成并不是一件小事想说爱它也并不是像简单来一个这样一件容易的事为什么要唯一数据库的自增在分库的时候会是一场灾难假设分两个库因为每个库都会开始从开始自增届时系统中将会出现两个为的用户自增会暴露用户量或者其他业务量自增会让有心者 [原文地址:https://blog.ti-node.com/blog...] 唯一ID的生成并不是一件小事 , 想说爱它 , 也并不是像简单来一个...

    pepperwang 评论0 收藏0
  • 分布式系统全局发号器的几点思考

    摘要:为什么需要发号器在分布式系统中,经常需要对大量的数据消息请求等进行唯一标识,例如对于分布式系统,服务间相互调用需要唯一标识,调用链路分析,日志追踪的时候需要使用这个唯一标识。 原文链接:何晓东 博客 文章起源于 康神交流群的 panda大佬和boss li关于发号器的一些交流,特此感谢让我们学到了新知识。 为什么需要发号器 在分布式系统中,经常需要对大量的数据、消息、http 请求等进...

    dayday_up 评论0 收藏0
  • 分布式ID生成方案小结

    摘要:几乎所有的系统都存在生成唯一的需求,如用户账单等,由于系统通常是分布式架构,因而需要有合适的分布式生成方案。优势和数据库自增方案类似缺点同样仍然有性能上限,依赖数据库的可用性。使用时,可以使用具体的场景选择合适的方案。几乎所有的系统都存在生成唯一ID的需求,如用户ID、账单ID等,由于系统通常是分布式架构,因而需要有合适的分布式ID生成方案。常见的分布式唯一ID方法有(欢迎补充):时间戳数据...

    Tecode 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<