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的簡要介紹和使用方法的詳細說明,希望可以幫助讀者更好地理解和使用它。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/185005.html