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; } MapnewTinyServerMap = 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的简要介绍和使用方法的详细说明,希望可以帮助读者更好地理解和使用它。