少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks
              Twitter-Snowflake算法產(chǎn)生的背景相當(dāng)簡單,為了滿足Twitter每秒上萬條消息的請求,每條消息都必須分配一條唯一的id,這些id還需要一些大致的順序(方便客戶端排序),并且在分布式系統(tǒng)中不同機器產(chǎn)生的id必須不同。

          生成的ID是64Bits整型數(shù),同時滿足高性能(>10K ids/s),低延遲(<2ms)和高可用。

          在分布式系統(tǒng)中,需要生成全局UID的場合還是比較多的,twitter的snowflake解決了這種需求,實現(xiàn)也還是很簡單的,除去配置信息,核心代碼就是毫秒級時間41位+機器ID 10位+毫秒內(nèi)序列12位。

          該項目地址為:https://github.com/twitter/snowflake是用Scala實現(xiàn)的。

          python版詳見開源項目https://github.com/erans/pysnowflake

          核心代碼為其IdWorker這個類實現(xiàn),其原理結(jié)構(gòu)如下,我分別用一個0表示一位,用—分割開部分的作用:

          0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---0000000000 00

          在上面的字符串中,第一位為未使用(實際上也可作為long的符號位),接下來的41位為毫秒級時間,然后5位datacenter標(biāo)識位,5位機器ID(并不算標(biāo)識符,實際是為線程標(biāo)識),然后12位該毫秒內(nèi)的當(dāng)前毫秒內(nèi)的計數(shù),加起來剛好64位,為一個Long型。

          這樣的好處是,整體上按照時間自增排序,并且整個分布式系統(tǒng)內(nèi)不會產(chǎn)生ID碰撞(由datacenter和機器ID作區(qū)分),并且效率較高,經(jīng)測試,snowflake每秒能夠產(chǎn)生26萬ID左右,完全滿足需要。

          1. 41位的時間序列(精確到毫秒,41位的長度可以使用69年) 

          2. 10位的機器標(biāo)識(10位的長度最多支持部署1024個節(jié)點,支持多機房的分布式,需要使用zookeeper) 

          3. 12位的計數(shù)順序號(12位的計數(shù)順序號支持每個節(jié)點每毫秒產(chǎn)生4096個ID序號) 最高位是符號位,始終為0。

          //64--------63-----------22-----------12----------0
          //符號位 |41位時間 |10位機器碼 |12位自增碼|

          對twitter而言這樣的ID生成方案滿足:

          1.每秒能夠生成足夠的ID數(shù)。 2.生成的ID按照時間大致有序。

          用zookeeper的原因是需要獲取一個workerId,當(dāng)然你也可以給分布式節(jié)點手工指定不同的workderId,那樣就不需要用zookeeper了。

          一個server一個workerid, 用zookeeper做保證.


          除了最高位bit標(biāo)記為不可用以外,其余三組bit占位均可浮動,看具體的業(yè)務(wù)需求而定。默認(rèn)情況下41bit的時間戳可以支持該算法使用到2082年,10bit的工作機器id可以支持1023臺機器,序列號支持1毫秒產(chǎn)生4095個自增序列id
















          posted on 2015-05-17 13:20 abin 閱讀(1211) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 普洱| 宝山区| 双柏县| 原平市| 鲁山县| 平乐县| 宁国市| 广安市| 壶关县| 莫力| 莒南县| 宜宾县| 中超| 济宁市| 始兴县| 礼泉县| 小金县| 江口县| 天等县| 浏阳市| 鄂州市| 九江市| 漳州市| 丹阳市| 阿合奇县| 石林| 乡城县| 浑源县| 乌什县| 临澧县| 云霄县| 晋宁县| 晋州市| 柳江县| 乡宁县| 武隆县| 宁蒗| 车致| 克东县| 蓬莱市| 安乡县|