摘要:出于以上兩個原因,我們需要自己的發(fā)號器來產(chǎn)生。與此同時,為了保證執(zhí)行,具有原子性,我們使用來進(jìn)行實現(xiàn)。由于能力和水平有限,難免會有紕漏,希望及時指出。參考文章分布式生成器實現(xiàn)上實現(xiàn)原理
1、為什么要實現(xiàn)發(fā)號器
很多地方我們都需要一個全局唯一的編號,也就是uuid。舉一個常見的場景,電商系統(tǒng)產(chǎn)生訂單的時候,需要有一個對應(yīng)的訂單編號。在composer上我們也可以看到有很多可以產(chǎn)生uuid的優(yōu)秀組件。那么,為什么我們還要自己實現(xiàn)發(fā)號器,來產(chǎn)生uuid呢?想了一下,主要有兩個原因吧:
1、我希望uuid是可反解的,通過反解uuid可以得出和我業(yè)務(wù)相關(guān)的數(shù)據(jù)。而我看到的composer關(guān)于uuid的相關(guān)組件,生成的都是一串指定格式的字符串,我很難將它同具體的業(yè)務(wù)關(guān)聯(lián)起來。
2、我希望通過uuid是可以隨著并放量進(jìn)行調(diào)整的。比如說原有支持1秒鐘可以產(chǎn)生1000個uuid,但隨著業(yè)務(wù)規(guī)模增長,我希望變成可以支持1秒鐘產(chǎn)生一萬個。而且,最好改下配置就可以了。
出于以上兩個原因,我們需要自己的發(fā)號器來產(chǎn)生uuid。那么,下一個問題是,我們應(yīng)該如何實現(xiàn)發(fā)號器,實現(xiàn)發(fā)號器的原理又是什么呢?
2、snowFlake算法關(guān)于發(fā)號器的實現(xiàn)原理,可能大家都聽過鼎鼎大名的snowflake算法 -- 雪花算法,Twitter的分布式自增Id算法。國內(nèi)的新浪微博也有自己實現(xiàn)的發(fā)號器算法,具體實現(xiàn)細(xì)節(jié)雖有不同,但是原理相通,明白其中一個即可。這里我們主要介紹snowflake。
關(guān)于snowflaw的介紹,已經(jīng)有很多文章進(jìn)行介紹,而且寫的也很不錯,我沒有必要在重寫一遍,拿來粘貼即可,出于對作者的尊重,我會將原文鏈接添加到參考鏈接中。
推特的分布式自增ID算法,使用long (8 × 8 = 64 byte)來保存uuid。其中1bit留給固定符號位0,41bit留給毫秒時間戳,10bit給MachineID,也就是機(jī)器要預(yù)先配置,剩下12位留Sequence(可支持1毫秒內(nèi)4096個請求)。
也許有的人會問如果超過了1毫秒4096個請求怎么辦?一般的做法是,讓它等上1毫秒,促使41bit的時間戳變化。
這里我們將MachineId進(jìn)行了拆分,5byte留給機(jī)器(最多可以支持32機(jī)器),5byte留給了業(yè)務(wù)號(最多可支持32種業(yè)務(wù))
這里的時間戳保存的是當(dāng)前時間與固定過去時間得一個差值,不是當(dāng)前時間。這樣的好處是能使用更長時間,而且不受年份限制,只取決于從什么時候開始用的,2^41 / 1000360024*365=69年。
如果保存的是當(dāng)前時間戳,最多只能使用到2039年。2^41=2199023255552=2039/9/7 23:47:35
理論上單機(jī)速度:2^12*1000 = 4 096 000/s
通過對snowflake的初步了解,發(fā)現(xiàn),其實發(fā)號器也是建立在時間戳基礎(chǔ)之上的,因為時間是天然的唯一元素。但是,如何在單位時間內(nèi),比如說一秒鐘或者一毫秒之內(nèi),保證Sequence持續(xù)遞增才是發(fā)號器實現(xiàn)的關(guān)鍵。
這里我們實現(xiàn)的方式比較簡單,直接使用redis的incr進(jìn)行計數(shù),對應(yīng)的key就是毫秒時間戳。出于redis內(nèi)存回收的考慮,我們需要將每一個key設(shè)置過期時間。如果key是秒級別的時間戳,那么過期時間就是1秒 + 網(wǎng)絡(luò)延遲;如果key毫秒級別的時間戳,那么過期時間就是1毫秒 + 網(wǎng)絡(luò)延遲。
與此同時,為了保證執(zhí)行incr,expire(pexpire)具有原子性,我們使用lua來進(jìn)行實現(xiàn)。
好了,實現(xiàn)的思路大致如此。由于能力和水平有限,難免會有紕漏,希望及時指出。
4、參考文章分布式ID生成器PHP+Swoole實現(xiàn)(上) - 實現(xiàn)原理
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/31404.html
摘要:接著上一篇實現(xiàn)一個簡單的發(fā)號器原理篇,本篇講一下發(fā)號器的具體實現(xiàn)。統(tǒng)計最后一列的總數(shù)量和去重后的數(shù)量是否一致即可。 接著上一篇 php + redis + lua 實現(xiàn)一個簡單的發(fā)號器(1)-- 原理篇,本篇講一下發(fā)號器的具體實現(xiàn)。 1、基礎(chǔ)知識 發(fā)號器的實現(xiàn)主要用到了下面的一些知識點: 1. php中的位運算的操作和求值 2. 計算機(jī)原碼、補(bǔ)碼、反碼的基本概念 3. redis中l(wèi)u...
摘要:為什么需要發(fā)號器在分布式系統(tǒng)中,經(jīng)常需要對大量的數(shù)據(jù)消息請求等進(jìn)行唯一標(biāo)識,例如對于分布式系統(tǒng),服務(wù)間相互調(diào)用需要唯一標(biāo)識,調(diào)用鏈路分析,日志追蹤的時候需要使用這個唯一標(biāo)識。 原文鏈接:何曉東 博客 文章起源于 康神交流群的 panda大佬和boss li關(guān)于發(fā)號器的一些交流,特此感謝讓我們學(xué)到了新知識。 為什么需要發(fā)號器 在分布式系統(tǒng)中,經(jīng)常需要對大量的數(shù)據(jù)、消息、http 請求等進(jìn)...
摘要:舉個例子,第一個進(jìn)來的鏈接發(fā)號器發(fā)號,對應(yīng)的短鏈接為,第二個進(jìn)來的鏈接發(fā)號器發(fā)號,對應(yīng)的短鏈接為,以此類推。這樣一來會導(dǎo)致一條長鏈接對應(yīng)多條短鏈接的情況出現(xiàn),不僅浪費存儲空間,又浪費發(fā)號器資源。 1. 什么是短鏈接 顧名思義,短鏈接即是長度較短的網(wǎng)址。通過短鏈接技術(shù),我們可以將長度較長的鏈接壓縮成較短的鏈接。并通過跳轉(zhuǎn)的方式,將用戶請求由短鏈接重定向到長鏈接上去。短鏈接主要用在諸如微博...
閱讀 2101·2023-04-25 17:23
閱讀 2919·2021-11-17 09:33
閱讀 2513·2021-08-21 14:09
閱讀 3579·2019-08-30 15:56
閱讀 2605·2019-08-30 15:54
閱讀 1623·2019-08-30 15:53
閱讀 2126·2019-08-29 13:53
閱讀 1141·2019-08-29 12:31