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的簡要介紹和使用方法的詳細說明,希望可以幫助讀者更好地理解和使用它。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/185005.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-26 05:03
下一篇 2024-11-26 05:03

相關推薦

  • KeyDB Java:完美的分佈式高速緩存方案

    本文將從以下幾個方面對KeyDB Java進行詳細闡述:KeyDB Java的特點、安裝和配置、使用示例、性能測試。 一、KeyDB Java的特點 KeyDB Java是KeyD…

    編程 2025-04-29
  • openeuler安裝數據庫方案

    本文將介紹在openeuler操作系統中安裝數據庫的方案,並提供代碼示例。 一、安裝MariaDB 下面介紹如何在openeuler中安裝MariaDB。 1、更新軟件源 sudo…

    編程 2025-04-29
  • Java Hmily分佈式事務解決方案

    分佈式系統是現在互聯網公司架構中的必備項,但隨着業務的不斷擴展,分佈式事務的問題也日益凸顯。為了解決分佈式事務問題,Java Hmily分佈式事務解決方案應運而生。本文將對Java…

    編程 2025-04-28
  • Python性能優化方案

    本文將從多個方面介紹Python性能優化方案,並提供相應的示例代碼。 一、使用Cython擴展 Cython是一個Python編譯器,可以將Python代碼轉化為C代碼,可顯著提高…

    編程 2025-04-28
  • 使用RPC研發雲實現分佈式服務交互

    本文將基於RPC研發雲,闡述分佈式服務交互實現的過程和實現方式。 一、RPC研發雲簡介 RPC研發雲是一種基於分佈式架構的服務框架,在處理不同語言之間的通信上變得越來越流行。通過使…

    編程 2025-04-28
  • JL Transaction – 實現分佈式事務管理的利器

    本文將為大家介紹JL Transaction,這是一款可以實現分佈式事務管理的開源事務框架,它可以幫助企業在分佈式環境下有效地解決事務的一致性問題,從而保障系統的穩定性和可靠性。 …

    編程 2025-04-28
  • NB設備上傳數據方案

    NB(Narrow Band)是一種物聯網通信技術,可以實現低功耗、寬覆蓋、多連接等特點。本文旨在探討如何使用NB設備上傳數據。在這篇文章中,我們將介紹NB設備上傳數據的基本原理、…

    編程 2025-04-27
  • 分佈式文件系統數據分佈算法

    數據分佈算法是分佈式文件系統中的重要技術之一,它能夠實現將文件分散存儲於各個節點上,提高系統的可靠性和性能。在這篇文章中,我們將從多個方面對分佈式文件系統數據分佈算法進行詳細的闡述…

    編程 2025-04-27
  • Android和Vue3混合開發方案

    本文將介紹如何將Android和Vue3結合起來進行混合開發,以及其中的優勢和注意事項。 一、環境搭建 在進行混合開發之前,需要搭建好相應的開發環境。首先需要安裝 Android …

    編程 2025-04-27
  • Rappor——谷歌推出的安全數據收集方案

    Rappor是一種隱私保護技術,可以在保持用戶私密信息的前提下,收集用戶的隨機信號數據。它可以用於應對廣泛的數據收集需求,讓用戶在參與數據收集的過程中感到安全和安心。 一、Rapp…

    編程 2025-04-27

發表回復

登錄後才能評論