最常用的分布式 ID 解決方案,都在這里了
1、用 Java 擼了一款 SSH 客戶端 2、處理 Exception 的幾種實(shí)踐,很優(yōu)雅,被很多團(tuán)隊(duì)采納! 3、一致性協(xié)議算法-2PC、3PC、Paxos、Raft、ZAB、NWR詳解 4、這款I(lǐng)DEA插件刷爆了朋友圈,網(wǎng)友:一定是女朋友送的~ 5、@Autowire和@Resource注解使用的正確姿勢(shì),別再用錯(cuò)的了??!
「一、分布式ID概念」
「二、分布式ID實(shí)現(xiàn)方案」


雪花算法能存放多少數(shù)據(jù)?時(shí)間范圍:2^41 / (3652460601000) = 69年 工作進(jìn)程范圍:2^10 = 1024 序列號(hào)范圍:2^12 = 4096,表示1ms可以生成4096個(gè)ID。
public?class?SnowFlake?{
????/**
?????*?起始的時(shí)間戳
?????*/
????private?final?static?long?START_STMP?=?1480166465631L;
????/**
?????*?每一部分占用的位數(shù)
?????*/
????private?final?static?long?SEQUENCE_BIT?=?12;?//序列號(hào)占用的位數(shù)
????private?final?static?long?MACHINE_BIT?=?5;???//機(jī)器標(biāo)識(shí)占用的位數(shù)
????private?final?static?long?DATACENTER_BIT?=?5;//數(shù)據(jù)中心占用的位數(shù)
????/**
?????*?每一部分的最大值
?????*/
????private?final?static?long?MAX_DATACENTER_NUM?=?-1L?^?(-1L?<????private?final?static?long?MAX_MACHINE_NUM?=?-1L?^?(-1L?<????private?final?static?long?MAX_SEQUENCE?=?-1L?^?(-1L?<
????/**
?????*?每一部分向左的位移
?????*/
????private?final?static?long?MACHINE_LEFT?=?SEQUENCE_BIT;
????private?final?static?long?DATACENTER_LEFT?=?SEQUENCE_BIT?+?MACHINE_BIT;
????private?final?static?long?TIMESTMP_LEFT?=?DATACENTER_LEFT?+?DATACENTER_BIT;
????private?long?datacenterId;??//數(shù)據(jù)中心
????private?long?machineId;?????//機(jī)器標(biāo)識(shí)
????private?long?sequence?=?0L;?//序列號(hào)
????private?long?lastStmp?=?-1L;//上一次時(shí)間戳
????public?SnowFlake(long?datacenterId,?long?machineId)?{
????????if?(datacenterId?>?MAX_DATACENTER_NUM?||?datacenterId?0)?{
????????????throw?new?IllegalArgumentException("datacenterId?can't?be?greater?than?MAX_DATACENTER_NUM?or?less?than?0");
????????}
????????if?(machineId?>?MAX_MACHINE_NUM?||?machineId?0)?{
????????????throw?new?IllegalArgumentException("machineId?can't?be?greater?than?MAX_MACHINE_NUM?or?less?than?0");
????????}
????????this.datacenterId?=?datacenterId;
????????this.machineId?=?machineId;
????}
????/**
?????*?產(chǎn)生下一個(gè)ID
?????*
?????*?@return
?????*/
????public?synchronized?long?nextId()?{
????????long?currStmp?=?getNewstmp();
????????if?(currStmp?????????????throw?new?RuntimeException("Clock?moved?backwards.??Refusing?to?generate?id");
????????}
????????if?(currStmp?==?lastStmp)?{
????????????//相同毫秒內(nèi),序列號(hào)自增
????????????sequence?=?(sequence?+?1)?&?MAX_SEQUENCE;
????????????//同一毫秒的序列數(shù)已經(jīng)達(dá)到最大
????????????if?(sequence?==?0L)?{
????????????????currStmp?=?getNextMill();
????????????}
????????}?else?{
????????????//不同毫秒內(nèi),序列號(hào)置為0
????????????sequence?=?0L;
????????}
????????lastStmp?=?currStmp;
????????return?(currStmp?-?START_STMP)?<????????????????|?datacenterId?<????????????????|?machineId?<????????????????|?sequence;?????????????????????????????//序列號(hào)部分
????}
????private?long?getNextMill()?{
????????long?mill?=?getNewstmp();
????????while?(mill?<=?lastStmp)?{
????????????mill?=?getNewstmp();
????????}
????????return?mill;
????}
????private?long?getNewstmp()?{
????????return?System.currentTimeMillis();
????}
????public?static?void?main(String[]?args)?{
????????SnowFlake?snowFlake?=?new?SnowFlake(2,?3);
????????for?(int?i?=?0;?i?(1?<12);?i++)?{
????????????System.out.println(snowFlake.nextId());
????????}
????}
}
「三、分布式ID開源組件」
3.1 如何選擇開源組件
3.2 美團(tuán)Leaf
全局唯一,絕對(duì)不會(huì)出現(xiàn)重復(fù)的ID,且ID整體趨勢(shì)遞增。 高可用,服務(wù)完全基于分布式架構(gòu),即使MySQL宕機(jī),也能容忍一段時(shí)間的數(shù)據(jù)庫(kù)不可用。 高并發(fā)低延時(shí),在CentOS 4C8G的虛擬機(jī)上,遠(yuǎn)程調(diào)用QPS可達(dá)5W+,TP99在1ms內(nèi)。 接入簡(jiǎn)單,直接通過公司RPC服務(wù)或者HTTP調(diào)用即可接入。
3.3 百度UidGenerator
3.4 開源組件對(duì)比
作者:James_Shangguan 來(lái)源:urlify.cn/3ARJRr
最近熱文閱讀:
1、用 Java 擼了一款 SSH 客戶端 2、處理 Exception 的幾種實(shí)踐,很優(yōu)雅,被很多團(tuán)隊(duì)采納! 3、一致性協(xié)議算法-2PC、3PC、Paxos、Raft、ZAB、NWR詳解 4、這款I(lǐng)DEA插件刷爆了朋友圈,網(wǎng)友:一定是女朋友送的~ 5、@Autowire和@Resource注解使用的正確姿勢(shì),別再用錯(cuò)的了!! 6、Java中的Switch都支持String了,為什么不支持long? 7、請(qǐng)謹(jǐn)慎使用Arrays.asList、ArrayList的subList 8、人臉識(shí)別“抓”錯(cuò)了人,他在監(jiān)獄呆了 10 天 9、騷操作 !IDEA 防止寫代碼沉迷插件 ! 10、這四種情況下,才是考慮分庫(kù)分表的時(shí)候! 關(guān)注公眾號(hào),你想要的Java都在這里
評(píng)論
圖片
表情
