jdbc 自增id 原理_面试被问分布式ID怎么办? 滴滴(Tinyid)甩给他
點擊“?程序員內(nèi)點事?”關注,選擇“?設置星標?”
堅持學習,好文每日送達!
引言接著《一口氣說出 9種 分布式ID生成方式,面試官有點懵了》來繼續(xù)詳細的介紹分布式ID生成器,大家比較感興趣的美團(Leaf)、滴滴(Tinyid)、百度(uid-generator)三個開源項目,美團(Leaf)已經(jīng)講完,詳見《9種分布式ID生成之美團(Leaf)實戰(zhàn)》,今天結(jié)合實戰(zhàn)搞一下滴滴開源的(Tinyid)。
Tinyid介紹
Tinyid是滴滴開發(fā)的一款分布式ID系統(tǒng),Tinyid是在美團(Leaf)的leaf-segment算法基礎上升級而來,不僅支持了數(shù)據(jù)庫多主節(jié)點模式,還提供了tinyid-client客戶端的接入方式,使用起來更加方便。但和美團(Leaf)不同的是,Tinyid只支持號段一種模式不支持雪花模式。
Tinyid的特性
全局唯一的long型ID
趨勢遞增的id
提供 http 和 java-client 方式接入
支持批量獲取ID
支持生成1,3,5,7,9…序列的ID
支持多個db的配置
適用場景:只關心ID是數(shù)字,趨勢遞增的系統(tǒng),可以容忍ID不連續(xù),可以容忍ID的浪費
不適用場景:像類似于訂單ID的業(yè)務,因生成的ID大部分是連續(xù)的,容易被掃庫、或者推算出訂單量等信息
Tinyid原理
Tinyid是基于號段模式實現(xiàn),再簡單啰嗦一下號段模式的原理:就是從數(shù)據(jù)庫批量的獲取自增ID,每次從數(shù)據(jù)庫取出一個號段范圍,例如?(1,1000]?代表1000個ID,業(yè)務服務將號段在本地生成1~1000的自增ID并加載到內(nèi)存.。
Tinyid會將可用號段加載到內(nèi)存中,并在內(nèi)存中生成ID,可用號段在首次獲取ID時加載,如當前號段使用達到一定比例時,系統(tǒng)會異步的去加載下一個可用號段,以此保證內(nèi)存中始終有可用號段,以便在發(fā)號服務宕機后一段時間內(nèi)還有可用ID。
原理圖大致如下圖:
在這里插入圖片描述Tinyid實現(xiàn)
Tinyid的GitHub地址 :https://github.com/didi/tinyid.git
Tinyid提供了兩種調(diào)用方式,一種基于Tinyid-server提供的http方式,另一種Tinyid-client客戶端方式。
不管使用哪種方式調(diào)用,搭建Tinyid都必須提前建表tiny_id_info、tiny_id_token。
tiny_id_info表是具體業(yè)務方號段信息數(shù)據(jù)表
在這里插入圖片描述max_id?:號段的最大值
step:步長,即為號段的長度
biz_type:業(yè)務類型
號段獲取對max_id字段做一次update操作,update max_id= max_id + step,更新成功則說明新號段獲取成功,新的號段范圍是(max_id ,max_id +step]。
tiny_id_token是一個權限表,表示當前token可以操作哪些業(yè)務的號段信息。
在這里插入圖片描述修改tinyid-server中?\offline\application.properties?文件配置數(shù)據(jù)庫,由于tinyid支持數(shù)據(jù)庫多master模式,可以配置多個數(shù)據(jù)庫信息。啟動?TinyIdServerApplication?測試一下。
1datasource.tinyid.primary.driver-class-name=com.mysql.jdbc.Driver1、Http方式
tinyid內(nèi)部一共提供了四個http接口來獲取ID和號段。
1nextId、nextIdSimple都是獲取下一個ID,nextSegmentIdSimple、getNextSegmentId是獲取下一個可用號段。區(qū)別在于接口是否有返回狀態(tài)。
nextId:'http://localhost:9999/tinyid/id/nextId?bizType=test&token=0f673adf80504e2eaa552f5d791b644c'
response :
{
"data":?[2],
"code":?200,
"message":?""
}
nextId?Simple:
'http://localhost:9999/tinyid/id/nextIdSimple?bizType=test&token=0f673adf80504e2eaa552f5d791b644c'
response:?3
在這里插入圖片描述在這里插入圖片描述
2、Tinyid-client客戶端
如果不想通過http方式,Tinyid-client客戶端也是一種不錯的選擇。
引用?tinyid-server包
1啟動?tinyid-server項目打包后得到?tinyid-server-0.1.0-SNAPSHOT.jar?,設置版本?${tinyid.version}為0.1.0-SNAPSHOT。
在我們的項目?application.properties?中配置?tinyid-server服務的請求地址 和 用戶身份token
1tinyid.server=在Java代碼調(diào)用TinyId也很簡單,只需要一行代碼。
1??Tinyid整個項目的源碼實現(xiàn)也是比較簡單,像與數(shù)據(jù)庫交互更直接用jdbcTemplate實現(xiàn)
1@Override總結(jié)
兩種方式推薦使用Tinyid-client,這種方式ID為本地生成,號段長度(step)越長,支持的qps就越大,如果將號段設置足夠大,則qps可達1000w+。而且tinyid-client?對?tinyid-server?訪問變的低頻,減輕了server端的壓力。
往期精彩回顧為了不復制粘貼,我被逼著學會了JAVA爬蟲
一口氣說出 9種 分布式ID生成方式,面試官有點懵了
面試總被問分庫分表怎么辦?這些知識點你要懂
Redis 5種數(shù)據(jù)結(jié)構及對應使用場景,全會面試要加分的
基于 Java 實現(xiàn)的人臉識別功能(附源碼)
技術/面試/吐槽
程序員內(nèi)點事這都有長按掃碼可關注
在看點這里總結(jié)
以上是生活随笔為你收集整理的jdbc 自增id 原理_面试被问分布式ID怎么办? 滴滴(Tinyid)甩给他的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java防止Xss注入json_XSS的
- 下一篇: spring图片转视频_一直在用的 Sp