全局唯一ID在分散式系統中用來做什麼用?

這個全局唯一ID用到哪些場景中呢? 為什麼有些公司 還要單門的 有伺服器 提供生成全局ID的服務呢?使用UUID不行嗎?想不通為什麼要寫一個單門的功能。unique id 到底有哪些用途?


單調遞增的 id 能幹的事可多了,可以用來實現資料庫的 MVCC,進而實現 ACID 事務,檢測衝突什麼的。在分散式系統中尤其重要,這個領域其實說白了就是不停在和不確定的 wall clock 作鬥爭...如何用更弱的約束達到更強的一致性,我覺得單調遞增的唯一 id 生成器是一個利器


最簡單一個例子,在paxos演算法裡面第一步prepare階段的時候,需要比較一個proposal number,這個數字就要滿足

1. 集群內單調遞增的

2. 集群內全局唯一的.

參考:

Paxos (computer science)

只簡單生成uuid(man uuid)都不能滿足這個要求:-(, 其實可以有很簡單的演算法, 假設集群的伺服器節點固定(比如zookeeper), 每個伺服器有一個唯一sid,  演算法就非常簡單

def _increase_proposal_number(self):
return self.sid += len(server_list)

比如有節點 A(sid=10), B(sid=11) , C(sid=12),

那麼生產的proposal number 就是如下表

A: 10, 13, 16, 19 ...

B: 11, 14, 17, 20 ...

C: 12, 15, 18, 21 ...

這樣proposal number不僅全局唯一而且單調遞增


1.保證100%不重複。其他hash方式只能保證一定概率下不重複。

2.計數,方便統計。就算是環球量級的系統,使用預先批量分發ID的策略,這種設計很難成為瓶頸。

3.當索引用,優化性能。

4.看著方便,看著爽(工程師的小癖好)。

5.格式統一、處理方便、代碼好寫。

6.無限精度的自然數永遠不存在千年蟲問題。很多年後,這種協議仍然可用。

7.在數字不大的時候,對人類而言,讀寫方便。據說中國人對數字有天賦加成。


一方面 做transaction的時候能夠用來coordinate transaction。比如在timestamp ordering protocol中的全局唯一id的作用實質上可以看成是讀寫鎖。又比如在optimistic concurrency control中的單調唯一id可以幫助驗證讀操作是否consistent。

另一方面 全局唯一id在logging中很有用,所謂的LSN就是全局唯一的,這個id可以保證你的系統掛掉的時候恢復出正確的狀態。

還有一方面,很多分散式系統都是多版本的(multi-versioning),這種情況下全局唯一id用來標記版本的時間,之後做time-travel query(或者snapshot transaction,或者checkpoint)可以拿到一個consistent的版本。

在流數據處理(stream processing)中單調唯一id保證任意一個事件只被處理一次。

值得一提的是id並不一定是要單調增的。其實有各種機制可以讓系統在沒有單調id的時候照樣正常工作。一些系統(尤其research中)不實現單調遞增id是因為生成這種id本身就有overhead。目前工業界的系統中使用單調遞增id其實主要原因是簡單方便易於解釋。


可以去了解一下:分散式自增ID解決方案-Twitter Snowflake


uuid 還有一個重要的問題就是...慢. 實際上在大多數場景中, 根本用不著uuid那種方式來保證唯一性, 可以有更簡單的辦法, 具體的可以參考mongodb的id生成跟twitter的snowflake


太多了,比如冪等,調用鏈.....


站在業務系統角度,用作分散式鏈路追蹤,方便定位問題。


可以了解下zookeeper,使用全局id作為zxid


比如你想讓用戶使用uuid來當qq號嗎


這個不光分散式系統,廣告統計和渠道追蹤平台也需要。因為要確認請求和反饋的唯一性來確保統計數據的真實有效。


。。。。。。。。。。


推薦閱讀:

TAG:分散式系統 | 高可用 | 微信開發 |