您的位置:

TinyID——分布式ID生成方案

TinyID是美团点评在分布式系统中作为唯一ID生成服务的开源框架,具有高性能、高可用、易扩展等特点。它的设计初衷是支持亿级业务的高并发场景下分布式ID的生成需求,可以应用于分布式系统或单体系统中。

一、优点

TinyID在设计之初就考虑了分布式场景下ID生成的需求,具有以下特点:

1.高性能

TinyID的ID生成是基于Twitter的snowflake算法的改进版,使用类似于rang(区间)的方式预分配ID,实现了高效的ID生成和毫秒级的响应。同时,通过与业务ID的分离,使得ID生成与具体业务无关,使得生成ID成为一种无状态的服务。

    /**
     * 获取下一个 id block
     *
     * @return
     */
    public BlockAllocator generate() {
        long newCursor = this.cursor + eachAllocatorSize;
        BlockAllocator blockAllocator = new BlockAllocator(this.cursor, newCursor);
        this.cursor = newCursor;
        return blockAllocator;
    }

2.高可用

TinyID采用分布式架构来保证服务的高可用性,即多个TinyID集群间通过Redis进行数据同步,实现任意数量的TinyID集群之间的无缝切换,同时还对Master节点进行了检测,确保业务量大的情况下极少重分配。

    /**
     * 尝试从 master 重新获取策略,避免 master 挂掉后一段时间内,tiny_server_list 持有老的策略
     */
    private synchronized void refreshTinyServerList() {
        try {
            String tinyServerList = getConfig(CONFIG_TINY_SERVER_LIST);
            if (StringUtils.isBlank(tinyServerList)) {
                LOGGER.error("tinyServerList is blank.");
                return;
            }
            Map newTinyServerMap = new ConcurrentSkipListMap<>();
            String[] tinyServerArray = tinyServerList.split(",");
            for (String tinyServer : tinyServerArray) {
                String addr = StringUtils.trim(tinyServer.split(":")[0]);
                newTinyServerMap.put(addr, "");
            }
            this.tinyServerAddrSet = newTinyServerMap.keySet();
        } catch (Exception e) {
            LOGGER.error("refreshTinyServerList error.", e);
        }
    }

  

3.易扩展

可以通过TinyID的机制添加新的实例来扩展系统的能力,并且不会影响已有的实例。

    /**
     * init tiny server list
     */
    private void initTinyServerList() {
        String tinyServerList = getConfig(CONFIG_TINY_SERVER_LIST);
        if (StringUtils.isBlank(tinyServerList)) {
            LOGGER.error("tinyServerList is blank.");
            return;
        }
        String[] tinyServerArray = tinyServerList.split(",");
        for (String tinyServer : tinyServerArray) {
            String addr = StringUtils.trim(tinyServer);
            TinyServerInfo serverInfo = new TinyServerInfo(addr);
            this.tinyServerInfoList.add(serverInfo);
        }
    }

二、使用方法

在使用TinyID之前,需要首先搭建好相关环境,安装好Java和Redis,然后按照以下方法使用TinyID:

1.下载TinyID的源代码

2.配置TinyID

tiny.servers.configuration.filepath=tiny-servers.properties
tiny.redis.configuration=file:/data/appdatas/tair.properties

3.编译TinyID

$ cd ~/tinyid
$ mvn package

4.启动TinyID server

$ java -jar target/tinyid-server-${version}.jar  #version为当前版本号

5.使用TinyID

// 获取可用的 id block
TinyIdClient tinyIdClient = new TinyIdClient("http://localhost:9999");
BlockResp resp = tinyIdClient.nextIdBlock(bizType);
Long start = resp.getStartId();
Long end = resp.getEndId();

三、总结

TinyID作为一种分布式ID生成方案,具有可靠性高,复杂度低的特点,更适用于大规模、高并发的分布式系统。以上是我们对TinyID的简要介绍和使用方法的详细说明,希望可以帮助读者更好地理解和使用它。