分布式id生成器 美团leaf

712 阅读1分钟

  高平发优化

image.png

image.png

image.png

image.png

image.png

id生成器

image.png

弊端

nodeid由zk来分配好一点 他保证了C

image.png

image.png

取三台机器的时间比较一下 大致一样就行

image.png

源码解析

第一种方法 segment

首先看sql语句

image.png 1.以业务id为主键 2.max 就是现在用了多少个值 比如 开始是1 用了1000个 就是1001 3.step就是固定的步速 用于一次分配多少id

入口

image.png

最主要的步骤

1.初始化 获取所有的业务id 更新cache 把没有的业务号删掉 把新的加入 每隔60秒检查一次 2.双重检查 确保每一个业务id都搞定 3.取id 开启读锁 就是如果超了0.9就不玩了 下一个buffer就要准备好改业务的后续id 然后呼唤就行了,

public Result get(final String key) {
    if (!initOK) {
        return new Result(EXCEPTION_ID_IDCACHE_INIT_FALSE, Status.EXCEPTION);
    }
    if (cache.containsKey(key)) {
        SegmentBuffer buffer = cache.get(key);
        if (!buffer.isInitOk()) {
            synchronized (buffer) {
                if (!buffer.isInitOk()) {
                    try {
                        updateSegmentFromDb(key, buffer.getCurrent());
                        logger.info("Init buffer. Update leafkey {} {} from db", key, buffer.getCurrent());
                        buffer.setInitOk(true);
                    } catch (Exception e) {
                        logger.warn("Init buffer {} exception", buffer.getCurrent(), e);
                    }
                }
            }
        }
        return getIdFromSegmentBuffer(cache.get(key));
    }
    return new Result(EXCEPTION_ID_KEY_NOT_EXISTS, Status.EXCEPTION);
}