美團分布式 ID 框架 Leaf 介紹和使用

一、Leaf

在當今日益數字化的世界里,軟件系統的開發已經成為了幾乎所有行業的核心。然而,隨著應用程序的規模不斷擴大,以及對性能和可擴展性的需求不斷增加,傳統的軟件架構和設計模式也在不斷地面臨挑戰。其中一個主要挑戰就是如何有效地處理分布式環境中的唯一標識問題。這正是分布式ID 的重要性所在。

分布式ID的實現方式有多種多樣,常見的包括 UUIDSnowflake 算法、TwitterSnowflake 算法、基于數據庫的自增長ID 等。每種方式都有其適用的場景和優缺點。

比如常見的 UUID , 標準型式包含3216進制數字,以連字號分為五段,形式為8-4-4-4-1236個字符,優點是性能非常高,本地生成,沒有網絡消耗,但缺點也顯而易見,首先不易于存儲,UUID太長,16字節128位,通常以36長度的字符串表示,很多場景不適用。其次信息不安全,基于MAC地址生成UUID的算法可能會造成MAC地址泄露,這個漏洞曾被用于尋找梅麗莎病毒的制作者位置。也不適合作為DB的主鍵。MySQL官方有明確的建議主鍵要盡量越短越好。

基于數據庫的自增長ID 的方式,實現起來非常簡單,并且ID是單向自增順序的,但缺點也很明顯,過度依賴于 DB 數據庫,在并發量高的情況下數據庫成為了性能瓶頸。

基于Snowflake 算法的方式,可以解決上述提到的問題,并且穩定性和靈活性都非常高,但強依賴于機器時鐘,如果機器上時鐘回撥,會導致發號重復或者服務會處于不可用狀態。

既然如此,那下面我們來認識更強大的分布式ID生成器 Leaf ,它是美團開源的分布式 ID 生成器,旨在解決分布式系統中的唯一標識生成問題,確保在分布式環境下生成的 ID 具有全局唯一性、順序性和高性能。

Leaf 實現了Leaf-segmentLeaf-snowflake兩種方案。

Leaf-segment是一種基于數據庫的分布式 ID 生成方案,原始基于數據庫的自增長ID 方案,每次獲取ID都得讀寫一次數據庫,造成數據庫壓力大,該方案利用proxy server批量獲取,每次獲取一個segment(step決定大小)號段的值。用完之后再去數據庫獲取新的號段,可以大大的減輕數據庫的壓力。各個業務不同的發號需求用biz_tag字段來區分,每個biz-tagID獲取相互隔離,互不影響。如果以后有性能需求需要對數據庫擴容,不需要上述描述的復雜的擴容操作,只需要對biz_tag分庫分表就行。

Leaf-snowflake方案完全沿用snowflake方案的bit位設計,對于workerID的分配,使用Zookeeper持久順序節點的特性自動對snowflake節點配置wokerID,對于時鐘回撥問題,解決方案如下:

在這里插入圖片描述

更多介紹可以參考官方信息:

官方介紹地址:https://tech.meituan.com/2017/04/21/mt-leaf.html

github:https://github.com/Meituan-Dianping/Leaf.git

下面一起來實踐下Leaf的使用。

首先拉取 Leaf SpringBoot 封裝依賴源碼:

git clone -b feature/spring-boot-starter https://github.com/Meituan-Dianping/Leaf.git
cd leaf

使用 MavenLeaf 打到本地倉庫中

mvn clean install -Dmaven.test.skip=true 

在這里插入圖片描述

打包成功后,可以創建一個 SpringBoot 項目,在 pom 中加入下面依賴:

<dependency><artifactId>leaf-boot-starter</artifactId><groupId>com.sankuai.inf.leaf</groupId><version>1.0.1-RELEASE</version><exclusions><exclusion><groupId>com.alibaba</groupId><artifactId>druid</artifactId></exclusion><exclusion><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.6</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>

二、Leaf-segment 方式使用

首先創建leaf使用的數據庫:

CREATE DATABASE leaf

創建ID規則表:

CREATE TABLE `leaf_alloc` (`biz_tag` varchar(128)  NOT NULL DEFAULT '',`max_id` bigint(20) NOT NULL DEFAULT '1',`step` int(11) NOT NULL,`description` varchar(256)  DEFAULT NULL,`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`biz_tag`)
) ENGINE=InnoDB;

寫入兩個 biz_tag

insert into leaf_alloc(biz_tag, max_id, step, description) values('test1', 1, 2000, '測試1');
insert into leaf_alloc(biz_tag, max_id, step, description) values('test2', 1, 2000, '測試2');

項目中加入leaf 和數據庫配置:

leaf:name: test1segment:enable: trueurl: jdbc:mysql://localhost:3306/leaf?useUnicode=true&characterEncoding=utf8&serverTimezone=GMTusername: rootpassword: root

生成ID測試:

@Slf4j
@SpringBootTest
class LeafIdApplicationTests {@Resourceprivate SegmentService segmentService;@Testvoid contextLoads() {// 生成 1000 個IDStopWatch sw = new StopWatch();sw.start();for (int i = 0; i < 1000; i++) {long id1 = segmentService.getId("test1").getId();long id2 = segmentService.getId("test2").getId();log.info("id1: {}, id2: {}", id1, id2);}sw.stop();log.info(sw.prettyPrint());}}

在這里插入圖片描述
可以看到在約 0.178 秒的時間,為兩個業務場景生成了 1000ID

三、Leaf-snowflake 方式使用

這種模式依賴于 Zookeeper ,所以在實驗前你需要有一個運行中的 Zookeeper 服務。

這種模式操作ZK使用 curator,因此需要引入 curator 的依賴:

<dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>2.12.0</version>
</dependency>

在配置文件中開啟Leaf-snowflake 模式:

leaf:name: test1segment:enable: trueurl: jdbc:mysql://localhost:3306/leaf?useUnicode=true&characterEncoding=utf8&serverTimezone=GMTusername: rootpassword: rootsnowflake:enable: trueaddress: 127.0.0.1port: 2181

生成ID測試:

@Slf4j
@SpringBootTest
class LeafIdApplicationTests {@Resourceprivate SegmentService segmentService;@Resourceprivate SnowflakeService snowflakeService;@Testvoid contextLoads() {// 生成 1000 個IDStopWatch sw = new StopWatch();sw.start();for (int i = 0; i < 1000; i++) {long id1 = snowflakeService.getId("test1").getId();long id2 = snowflakeService.getId("test2").getId();log.info("id1: {}, id2: {}", id1, id2);}sw.stop();log.info(sw.prettyPrint());}}

在這里插入圖片描述

可以看到相比于上面數據庫模式,僅需要約 0.0234105 秒,性能更高,而且做到ID不是順序+1式增長。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714765.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714765.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714765.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學生云服務器_學生云主機_學生云數據庫_云+校園特惠套餐

2024年騰訊云學生服務器優惠活動「云校園」&#xff0c;學生服務器優惠價格&#xff1a;輕量應用服務器2核2G學生價30元3個月、58元6個月、112元一年&#xff0c;輕量應用服務器4核8G配置191.1元3個月、352.8元6個月、646.8元一年&#xff0c;CVM云服務器2核4G配置842.4元一年&…

自注意力機制(Self-Attention)

注意&#xff1a;本文引用自專業人工智能社區Venus AI 更多AI知識請參考原站&#xff08;【http://www.aideeplearning.cn】&#xff09; Transformer模型中最關鍵部分就是自注意力&#xff08;Self-Attention&#xff09;機制&#xff0c;正如 Transformer 的論文的標題是“…

【Vue3】函數式編程(h 函數)

h 函數的原理就是 createVNode。可以使用 h 函數封裝一些小組件。 <template><table border><tr><th>name</th><th>age</th><th>操作</th></tr><tr v-for"item in list" :key"item.age"&…

shell封裝

shift 命令用于對參數的移動(左移)&#xff0c;通常用于在不知道傳入參數個數的情況下依次遍歷每個參數然后進行相應處理&#xff08;常見于Linux中各種程序的啟動腳本&#xff09; shift(shift 1) 命令每執行一次&#xff0c;變量的個數($#)減一&#xff0c;移動2位可以 執行…

數據結構實現-線性表

順序存儲 #include<iostream> using namespace std; #define MaxSize 50 //靜態順序表 template<typename ElemType> struct sqList{ElemType data[MaxSize];//元素int length;//長度 }; //動態順序表 #ifdef DEBUG //關閉啟用 #define InitSize 100 template<…

嵌入式LINUX移植、配置ssh

編譯 https://quantum6.blog.csdn.net/article/details/136299665 編譯時指定prefix&#xff0c;產生的文件會自帶這個目錄。所以直接忽略。 ./configure# 不指定編譯路徑&#xff0c;手動復制。 復制 編譯后的整個目錄打包&#xff0c;復制到開發板。寫個腳本&#xff0c…

kamacoder13.鏤空三角形的C語言解法

13. 鏤空三角形 時間限制&#xff1a;1.000S 空間限制&#xff1a;32MB 題目描述 把一個字符三角形掏空&#xff0c;就能節省材料成本&#xff0c;減輕重量&#xff0c;但關鍵是為了追求另一種視覺效果。在設計的過程中&#xff0c;需要給出各種花紋的材料和大小尺寸的三角…

零拷貝技術深入分析

一、零拷貝 在前面的文章“深淺拷貝、COW及零拷貝”中對零拷貝進行過分析&#xff0c;但沒有舉例子&#xff0c;也沒有深入進行展開分析。本文將結合實際的例程對零拷貝進行更深入的分析和說明。 在傳統的IO操作中&#xff0c;以文件通過網絡傳輸為例 &#xff0c;一般會經歷以…

go語言是如何連接mysql數據庫的?

在 Go 語言中連接 MySQL 數據庫通常使用第三方庫。目前比較流行的 MySQL 客戶端庫包括 github.com/go-sql-driver/mysql、github.com/go-xorm/xorm、github.com/jmoiron/sqlx 等。下面是一個使用 github.com/go-sql-driver/mysql 庫連接 MySQL 數據庫的簡單示例&#xff1a; 首…

GOPATH set to GOROOT (/usr/local/go) has no effect

這個警告信息指出 GOPATH 環境變量被設置為與 GOROOT 相同的值。GOPATH 環境變量用于指定 Go 工作區的位置&#xff0c;而 GOROOT 指定 Go 安裝的位置。將 GOPATH 設置為 GOROOT 表示 Go 工作區和 Go 安裝位置位于同一目錄&#xff0c;這是不推薦的。為了解決此問題&#xff0c…

Zookeeper集群docker部署

集群角色 zookeeper 集群中的機器分為一下三種角色 leader:為客戶端提供讀寫服務(事務性操作)&#xff0c;并維護集群狀態&#xff0c;它是由集群選舉所產生的&#xff1b; follower:為客戶端提供讀(非事務性操作)&#xff0c;轉發給leader寫(事務性操作)&#xff0c;參與選舉操…

K8s控制器

控制器: Deployment: Deployment概述: replicaset:自動創建pod的控制器 Delpoyment控制器: pod的名字需要唯一,在這不寫名字,利用標簽進行創建 replicas:表示你想要克隆的數量,selector:通過標簽.識別哪個pod是我創建出來的.這里的標簽和后面元數據里的標簽要一致. Cluster…

NCDA設計大賽獲獎作品剖析:UI設計如何脫穎而出?

第十二屆大賽簡介 - 未來設計師全國高校數字藝術設計大賽&#xff08;NCDA&#xff09;開始啦&#xff01;視覺傳達設計命題之一: ui 設計&#xff0c;你想知道的都在這里。為了讓大家更好的參加這次比賽&#xff0c;本文特別為大家整理了以往NCDA大賽 UI 設計的優秀獲獎作品&a…

【探索AI】十四深度學習之第2周:深度神經網絡(三)-過擬合與正則化技術

過擬合與正則化技術 過擬合的概念 在機器學習和深度學習的領域中&#xff0c;過擬合&#xff08;Overfitting&#xff09;是一個常見且重要的問題。首先&#xff0c;我們來理解一下什么是過擬合。 過擬合是指模型在訓練數據上表現得過于優秀&#xff0c;以至于在訓練集上的錯…

2024年騰訊云優惠券_代金券_云服務器折扣券免費領取鏈接

騰訊云優惠代金券領取入口共三個渠道&#xff0c;騰訊云新用戶和老用戶均可領取8888元代金券&#xff0c;可用于云服務器等產品購買、續費和升級使用&#xff0c;阿騰云atengyun.com整理騰訊云優惠券&#xff08;代金券&#xff09;領取入口、代金券查詢、優惠券兌換碼使用方法…

【SpringBean】bean的作用域和bean的生命周期

目錄 前言 一 bean的作用域 1. singleton——唯一 bean 實例 2. prototype——每次請求都會創建一個新的 bean 實例 3. request——每一次HTTP請求都會產生一個新的bean&#xff0c;該bean僅在當前HTTP request內有效 4. session——每一次HTTP請求都會產生一個新的 bean&…

程序員的金三銀四求職寶典!

目錄 ?編輯 程序員的金三銀四求職寶典 一、為什么金三銀四是程序員求職的黃金時期&#xff1f; 二、如何準備金三銀四求職&#xff1f; 1. 完善簡歷 2. 增強技術能力 3. 提前考慮目標公司 4. 提前準備面試 三、程序員求職的常見面試題 1. 數據結構和算法 2. 數據庫 …

一次電腦感染Synaptics Pointing Device Driver病毒的經歷,分享下經驗

沒想到作為使用電腦多年的老司機也會電腦中病毒&#xff0c;周末玩電腦的時候突然電腦很卡&#xff0c;然后自動重啟&#xff0c;奇怪&#xff0c;之前沒出現這個情況。 重啟后電腦開機等了幾十秒&#xff0c;打開任務管理器查看開機進程&#xff0c;果然發現有個Synaptics Po…

LeetCode 刷題 [C++] 第121題.買賣股票的最佳時機

題目描述 給定一個數組 prices &#xff0c;它的第 i 個元素 prices[i] 表示一支給定股票第 i 天的價格。 你只能選擇 某一天 買入這只股票&#xff0c;并選擇在 未來的某一個不同的日子 賣出該股票。設計一個算法來計算你所能獲取的最大利潤。 返回你可以從這筆交易中獲取的…

php兒童服裝銷售管理系統計算機畢業設計項目包運行調試

php mysql兒童服裝銷售網 功能&#xff1a;前臺后臺 前臺&#xff1a; 1.服裝資訊 文章標題列表 詳情 2.服裝選購中心 分頁查看圖文列表 詳情 3.用戶注冊 登陸 退出 4.服裝加入收藏 5.加入購物車 6.對服裝進行評論 會員中心&#xff1a; 1.我的賬戶 查看 修改 2.我的收藏 查看 …