1. 程式人生 > >分散式ID

分散式ID

參考自:https://blog.csdn.net/zcl111/article/details/75258258

簡介:

在系統小時,唯一標識的產生,可以利用公用模組來處理,比如資料庫表的唯一鍵、或者快取的唯一id等等方式。但在分散式高併發的系統中,如果還是這樣使用公共模組,就會產生很大的風險和瓶頸。網上也有相關推薦的,twitter的snowflake就能解決這個問題。

snowflake滿足了以下個要求: 
1. 只用64位就能達到要求;而無需128的方式。 
2. 考慮到排序的要求,標識的排序跟時間上基本能保持一致。 
3. 滿足了預期服務時間內的,即在多少年內此演算法適用。

snowflake演算法核心:

如圖,64位。主要由3塊構成:時間戳、工作機器id、序列號。 
- 其中第一位不用,也可以理解作為正負數來使用,預設正數的。 
- 隨後41位表示時間戳,在實際使用時,可以當做時間差來使用,比如現在離2017-01-01 00:00:00的時間差。這樣的話,時間範圍就能達到: (2^41-1)/(1000*60*60*24*365)=69.7年。 
- 中間10位用於工作機器的。可以用於 2^10-1=1023臺機器。 
- 最後12位表示序列號,一個機器在一個毫秒時最大能產生 2^12-1=4095個。 
**在實際應用中,可能無需最大化的,比如時間戳只用30位就能達到要求的就無需41位,其他的同理。 
工作機器ID,可以是程序級別。機器級別的話,可以使用機器的mac地址或ip地址經過演算法;如果是程序級別的話,可以使用path+程序標識;也可以混編,列如前5位標識機器,後5位標識程序。 
關於序列號有個注意點,如果一個毫秒內,序列號已經達到上限,就等到下一毫秒,同時序列號置零開始。**