野談系列之高性能可定制化分布式發(fā)號(hào)器

劉兵,花名玄靖,開(kāi)源技術(shù)愛(ài)好者,高性能Redis中間件NRedis-Proxy作者,目前研究方向?yàn)閖ava中間件,微服務(wù)等技術(shù)。

一、什么是分布式發(fā)號(hào)器

說(shuō)起分布式發(fā)號(hào)器的前生今世,咱們應(yīng)該感恩這個(gè)時(shí)代;隨著互聯(lián)網(wǎng)在中國(guó)越來(lái)越普及化,單機(jī)系統(tǒng)或者一個(gè)小系統(tǒng)已經(jīng)無(wú)法滿(mǎn)足需要,隨著用戶(hù)逐漸增多,數(shù)據(jù)量越來(lái)越大,單個(gè)應(yīng)用或者單個(gè)數(shù)據(jù)庫(kù)已經(jīng)無(wú)法滿(mǎn)足需求,在應(yīng)用以至于微服務(wù)來(lái)臨,在數(shù)據(jù)庫(kù)存儲(chǔ)方面分庫(kù)分表來(lái)臨,可以解決問(wèn)題;但是新的問(wèn)題產(chǎn)生,怎么樣做到多個(gè)應(yīng)用可以有唯一主鍵或者序號(hào),防止數(shù)據(jù)重復(fù)呢?分布式發(fā)號(hào)器正好為解決這個(gè)問(wèn)題,可以讓大家無(wú)須為這個(gè)問(wèn)題煩惱了,這是本人寫(xiě)這篇文章初衷。

二、分布式發(fā)號(hào)器優(yōu)勢(shì)

  1. 解決分庫(kù)分表中唯一序號(hào)的問(wèn)題
  2. 解決分布式應(yīng)用或者微服務(wù)框架中唯一序號(hào)的問(wèn)題
  3. 提供可定制化生成規(guī)則,根據(jù)業(yè)務(wù)需求可自定義擴(kuò)展
  4. 性能高效且系統(tǒng)簡(jiǎn)單穩(wěn)定
  5. 系統(tǒng)可任意擴(kuò)展

三、分布式發(fā)號(hào)器架構(gòu)圖

Paste_Image.png

四、分布式發(fā)號(hào)器流程圖

1、分布式發(fā)號(hào)器重要字段
Paste_Image.png
2、concurrentValue不存在的流程圖
圖片 1.png
3、concurrentValue存在的流程圖
圖片 2.png

五、目前存在分布式發(fā)號(hào)器解決方案

1、UUID

Universally Unique IDentifier(UUID),有著正兒八經(jīng)的RFC規(guī)范,是一個(gè)128bit的數(shù)字,也可以表現(xiàn)為32個(gè)16進(jìn)制的字符(每個(gè)字符0-F的字符代表4bit),中間用"-"分割。

  • 時(shí)間戳+UUID版本號(hào): 分三段占16個(gè)字符(60bit+4bit)
  • Clock Sequence號(hào)與保留字段:占4個(gè)字符(13bit+3bit)
  • 節(jié)點(diǎn)標(biāo)識(shí):占12個(gè)字符(48bit)
2、Hibernate

Hibernate的CustomVersionOneStrategy.java,解決了之前version 1的兩個(gè)問(wèn)題

  • 時(shí)間戳(6bytes, 48bit):毫秒級(jí)別的,從1970年算起,能撐8925年....
  • 順序號(hào)(2bytes, 16bit, 最大值65535): 沒(méi)有時(shí)間戳過(guò)了一毫秒要?dú)w零的事,各搞各的,short溢出到了負(fù)數(shù)就歸0。
  • 機(jī)器標(biāo)識(shí)(4bytes 32bit): 拿localHost的IP地址,IPV4呢正好4個(gè)byte,但如果是IPV6要16個(gè)bytes,就只拿前4個(gè)byte。
  • 進(jìn)程標(biāo)識(shí)(4bytes 32bit): 用當(dāng)前時(shí)間戳右移8位再取整數(shù)應(yīng)付,不信兩條線程會(huì)同時(shí)啟動(dòng)。
3、MongoDB

MongoDB的ObjectId.java
時(shí)間戳(4 bytes 32bit):是秒級(jí)別的,從1970年算起,能撐136年。

  • 自增序列(3bytes 24bit, 最大值一千六百萬(wàn)): 是一個(gè)從隨機(jī)數(shù)開(kāi)始(機(jī)智)的Int不斷加一,也沒(méi)有時(shí)間戳過(guò)了一秒要?dú)w零的事,各搞各的。因?yàn)橹挥?bytes,所以一個(gè)4bytes的Int還要截一下后3bytes。
  • 機(jī)器標(biāo)識(shí)(3bytes 24bit): 將所有網(wǎng)卡的Mac地址拼在一起做個(gè)HashCode,同樣一個(gè)int還要截一下后3bytes。搞不到網(wǎng)卡就用隨機(jī)數(shù)混過(guò)去。
  • 進(jìn)程標(biāo)識(shí)(2bytes 16bits):從JMX里搞回來(lái)到進(jìn)程號(hào),搞不到就用進(jìn)程名的hash或者隨機(jī)數(shù)混過(guò)去。
    可見(jiàn),MongoDB的每一個(gè)字段設(shè)計(jì)都比Hibernate的更合理一點(diǎn),時(shí)間戳是秒級(jí)別的,自增序列變長(zhǎng)了,進(jìn)程標(biāo)識(shí)變短了。總長(zhǎng)度也降到了12 bytes 96bit。
4、Twitter的snowflake派號(hào)器

snowflake也是一個(gè)派號(hào)器,基于Thrift的服務(wù),不過(guò)不是用redis簡(jiǎn)單自增,而是類(lèi)似UUID version1,只有一個(gè)Long 64bit的長(zhǎng)度,所以IdWorker緊巴巴的分配成:

  • 時(shí)間戳(42bit) :自從2012年以來(lái)(比那些從1970年算起的會(huì)過(guò)日子)的毫秒數(shù),能撐139年。
  • 自增序列(12bit,最大值4096):毫秒之內(nèi)的自增,過(guò)了一毫秒會(huì)重新置0。
  • DataCenter ID (5 bit, 最大值32):配置值,支持多機(jī)房。
  • Worker ID ( 5 bit, 最大值32),配置值,因?yàn)槭桥商?hào)器的id,一個(gè)機(jī)房里最多32個(gè)派號(hào)器就夠了,還會(huì)在ZK里做下注冊(cè)。

可見(jiàn),因?yàn)槭侵醒肱商?hào)器,把至少40bit的節(jié)點(diǎn)標(biāo)識(shí)都省出來(lái)了,換成10bit的派號(hào)器標(biāo)識(shí)。所以整個(gè)UID能夠只用一個(gè)Long表達(dá)。

另外,這種派號(hào)器,client每次只能一個(gè)ID,不能批量取,所以額外增加的延時(shí)是問(wèn)題,而且只能1024臺(tái)機(jī)器范圍之內(nèi)。

以上幾種方案同一個(gè)問(wèn)題,不可自定義,位數(shù)過(guò)長(zhǎng)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 簡(jiǎn)介 用簡(jiǎn)單的話來(lái)定義tcpdump,就是:dump the traffic on a network,根據(jù)使用者...
    保川閱讀 6,078評(píng)論 1 13
  • 這是一個(gè)悲傷又現(xiàn)實(shí)的故事 這一年他們6歲一年級(jí) “媽媽?zhuān)@個(gè)車(chē)子好長(zhǎng)?。?!”小男孩拉著媽媽的手說(shuō)到。 “這個(gè)車(chē)我們...
    渺渺櫻閱讀 498評(píng)論 4 5
  • 親愛(ài)的老爸: 你好嗎? 今天和笨笨也是早上去陪老媽?zhuān)勘靠偸瞧鹪缲澓诘膥 下午是何總的夫人接班,又要遲到,我和笨...
    老爸我很想你閱讀 138評(píng)論 0 0
  • 我是來(lái)自弗蘭克寫(xiě)作團(tuán)隊(duì)的一樽江月。 寫(xiě)作從來(lái)不是簡(jiǎn)簡(jiǎn)單單的表達(dá),寫(xiě)作是創(chuàng)作,寫(xiě)作是刻意訓(xùn)練。 今天是我刻意收集寫(xiě)作...
    江月的書(shū)妝臺(tái)閱讀 2,959評(píng)論 0 0

友情鏈接更多精彩內(nèi)容