在複雜分佈式系統中,每每須要對大量的數據和消息進行惟一標識。如在美團點評的金融、支付、餐飲、酒店、貓眼電影等產品的系統中,數據日漸增加,對數據分庫分表後須要有一個惟一ID來標識一條數據或消息,數據庫的自增ID顯然不能知足需求;特別一點的如訂單、騎手、優惠券也都須要有惟一ID作標識。此時一個可以生成全局惟一ID的系統是很是必要的。html
要求以下所示數據庫
1.全局惟一性:不能出現重複的ID號,既然是惟一標識,這是最基本的要求。 2.趨勢遞增:在MySQL InnoDB引擎中使用的是彙集索引,因爲多數RDBMS使用B-tree的數據結構來存儲索引數據,在主鍵的選擇上面咱們應該儘可能使用有序的主鍵保證寫入性能。 3.單調遞增:保證下一個ID必定大於上一個ID,例如事務版本號、IM增量消息、排序等特殊需求。 4.信息安全:若是ID是連續的,惡意用戶的扒取工做就很是容易作了,直接按照順序下載指定URL便可;若是是訂單號就更危險了,競對能夠直接知道咱們一天的單量。因此在一些應用場景下,會須要ID無規則、不規則。 5.分佈式id裏面最好包含時間戳,這樣就可以在開發中快速瞭解這個分佈式id的生成時間segmentfault
上述123對應三類不一樣的場景,3和4需求仍是互斥的,因此沒法使用同一個方案知足。安全
同時除了對ID號碼自身的要求,業務還對ID號生成系統的可用性要求極高,想象一下,若是ID生成系統癱瘓,整個美團點評支付、優惠券發券、騎手派單等關鍵動做都沒法執行,這就會帶來一場災難。由此我總結下一個ID生成系統應該作到以下幾點:服務器
可用性高:就是我用戶發了一個獲取分佈式id的請求,那麼你服務器就要保證99.999%的狀況下給我建立一個分佈式id 延遲低:就是我用戶給你一個獲取分佈式id的請求,那麼你服務器給我建立一個分佈式id的速度就要快 高QPS:這個就是用戶一會兒有10萬個建立分佈式id請求同時過去了,那麼你服務器要頂的住,你要一會兒給我成功建立10萬個分佈式id數據結構
原文連接分佈式
其餘分佈式ID系列快捷鍵: 分佈式ID系列(1)——爲何須要分佈式ID以及分佈式ID的業務需求性能
大佬網址.net