可以的。
全局唯一ID
有些同學可能會有疑問,MySQL數據庫本身就有自增長的主鍵,為什么還需要別的組件協助生成呢?
如果是單臺MySQL數據庫的話,當然是用本身的自增長序列就可以了,但是如果我們做了分庫分表之后呢?比如用戶表userTable數據量達到了4000萬,單表有些吃力,我們將userTable拆成兩張表保存到兩個MySQL數據庫中;這時候如果再使用數據庫本身的自增序列,倒是也不會有錯,每一個表內的主鍵不會重復,但是表和表比較的話,主鍵ID可能會發生重復;這時候就需要使用組件或者算法,生成全局唯一ID了。
MongoDBObjectId
MongoDB的ObjectId,也是可以用于全局唯一ID的。
{"_id":ObjectId("5d47ca7528021724ac19f745")}
MongoDB的ObjectId共占12個字節,其中:
3.2之前的版本(包括3.2):4字節時間戳+3字節機器標識符(機器ID)+2字節進程ID+3字節隨機計數器;
3.2之后版本:4字節時間戳+5字節隨機值+3字節遞增計數器;
其中時間戳字節可以保證毫秒級唯一,節機器標識符考慮到了分布式,字節進程ID保證了同一臺服務器運行多個實例時的唯一性,字節遞增計數器保證了同一個時間點內ID的唯一性。
優缺點
不管是老版本還是新版本,MongoDB的ObjectId至少都可以保證集群內的唯一,我們可以搭建一個全局唯一ID生成的服務,利用MongoDB生成ObjectId并對外提供服務(MongoDB的各語言驅動都實現了ObjectId的生成算法)。
優點:MongoDB的性能不錯,可以使用集群部署,保證其高可用;ID內自帶一些含義,比如時間戳,必要的時候可以進行反解;
缺點:和數據庫一樣,需要引入對應的組件/軟件,增加了系統的復雜度;最關鍵的是,這兩種方案都意味著生成全局唯一ID的系統(服務),會成為一個單點,在軟件架構中,單獨就意味著風險;如果這個服務出現問題,那么所有依賴于這個服務的系統都會崩潰掉。