類snowflake演算法

2021-08-19 18:56:10 字數 1300 閱讀 6098

**:

snowflake是twitter開源的分布式id生成演算法,其核心思想是:乙個long型的id,使用其中41bit作為毫秒數,10bit作為機器編號,12bit作為毫秒內序列號。這個演算法單機每秒內理論上最多可以生成1000*(2^12),也就是400w的id,完全能滿足業務的需求。

借鑑snowflake的思想,結合各公司的業務邏輯和併發量,可以實現自己的分布式id生成演算法。

舉例,假設某公司id生成器服務的需求如下:

(1)單機高峰併發量小於1w,預計未來5年單機高峰併發量小於10w

(2)有2個機房,預計未來5年機房數量小於4個

(3)每個機房機器數小於100臺

(4)目前有5個業務線有id生成需求,預計未來業務線數量小於10個

(5)…

分析過程如下:

(1)高位取從2023年1月1日到現在的毫秒數(假設系統id生成器服務在這個時間之後上線),假設系統至少執行10年,那至少需要10年*365天*24小時*3600秒*1000毫秒=320*10^9,差不多預留39bit給毫秒數

(2)每秒的單機高峰併發量小於10w,即平均每毫秒的單機高峰併發量小於100,差不多預留7bit給每毫秒內序列號

(3)5年內機房數小於4個,預留2bit給機房標識

(4)每個機房小於100臺機器,預留7bit給每個機房內的伺服器標識

(5)業務線小於10個,預留4bit給業務線標識

這樣設計的

64bit

標識,可以保證:

(1)每個業務線、每個機房、每個機器生成的id都是不同的

(2)同乙個機器,每個毫秒內生成的id都是不同的

(3)同乙個機器,同乙個毫秒內,以序列號區區分保證生成的id是不同的

(4)將毫秒數放在最高位,保證生成的id是趨勢遞增的

缺點

(1)由於「沒有乙個全域性時鐘」,每台伺服器分配的id是絕對遞增的,但從全域性看,生成的id只是趨勢遞增的(有些伺服器的時間早,有些伺服器的時間晚)

最後乙個容易忽略的問題

生成的id,例如message-id/ order-id/ tiezi-id,在資料量大時往往需要分庫分表,這些id經常作為取模分庫分表的依據,為了分庫分表後資料均勻,id生成往往有「取模隨機性」的需求,所以我們通常把每秒內的序列號放在id的最末位,保證生成的id是隨機的。

又如果,我們在跨毫秒時,序列號總是歸0,

會使得序列號為0的id比較多,導致生成的id取模後不均勻

。解決方法是,序列號不是每次都歸0,而是歸乙個0到9的隨機數,這個地方。

雪花演算法 snowflake

分布式系統中,有一些需要使用全域性唯一id的場景,這種時候為了防止id衝突可以使用36位的uuid,但是uuid有一些缺點,首先他相對比較長,另外uuid一般是無序的。有些時候我們希望能使用一種簡單一些的id,並且希望id能夠按照時間有序生成。而twitter的snowflake解決了這種需求,最初...

SnowFlake 雪花演算法

首先雪花演算法就是生成乙個64位的二進位制資料,最終轉換成長度為19的十進位制正整數整型資料 0 0000000000 0000000000 0000000000 0000000000 0 00000 00000 000000000000解釋一下這64位分別代表什麼意思,從左往右。當然這個演算法的強...

twitter的snowflake演算法

snowflake演算法是twitter提出的乙個用來生成不重複id的演算法,用於解決id衝突。適用於 先插資料,然後根據id更新資料。還有分布式多機同時取id。這個演算法本身並不複雜,它的原理是根據時間 ms 來不斷更新id。id由64bit組成,分為workerid datacenterid t...