VB編程能干什么?就業(yè)前景如何?
我用VB6開發(fā)的erp運(yùn)行了0年了
解析分布式主鍵MongoDBObjectId,可以作為Mysql主鍵嗎?
可以的。
全局唯一ID有些同學(xué)可能會(huì)有疑問(wèn),MySQL數(shù)據(jù)庫(kù)本身就有自增長(zhǎng)的主鍵,為什么還需要?jiǎng)e的組件協(xié)助生成呢?
如果是單臺(tái)MySQL數(shù)據(jù)庫(kù)的話,當(dāng)然是用本身的自增長(zhǎng)序列就可以了,但是如果我們做了分庫(kù)分表之后呢?比如用戶表userTable數(shù)據(jù)量達(dá)到了4000萬(wàn),單表有些吃力,我們將userTable拆成兩張表保存到兩個(gè)MySQL數(shù)據(jù)庫(kù)中;這時(shí)候如果再使用數(shù)據(jù)庫(kù)本身的自增序列,倒是也不會(huì)有錯(cuò),每一個(gè)表內(nèi)的主鍵不會(huì)重復(fù),但是表和表比較的話,主鍵ID可能會(huì)發(fā)生重復(fù);這時(shí)候就需要使用組件或者算法,生成全局唯一ID了。
MongoDBObjectIdMongoDB的ObjectId,也是可以用于全局唯一ID的。
{_id:ObjectId(5d47ca7528021724ac19f745)}
MongoDB的ObjectId共占12個(gè)字節(jié),其中:
3.2之前的版本(包括3.2):4字節(jié)時(shí)間戳3字節(jié)機(jī)器標(biāo)識(shí)符(機(jī)器ID)2字節(jié)進(jìn)程ID3字節(jié)隨機(jī)計(jì)數(shù)器;
3.2之后版本:4字節(jié)時(shí)間戳5字節(jié)隨機(jī)值3字節(jié)遞增計(jì)數(shù)器;
其中時(shí)間戳字節(jié)可以保證毫秒級(jí)唯一,節(jié)機(jī)器標(biāo)識(shí)符考慮到了分布式,字節(jié)進(jìn)程ID保證了同一臺(tái)服務(wù)器運(yùn)行多個(gè)實(shí)例時(shí)的唯一性,字節(jié)遞增計(jì)數(shù)器保證了同一個(gè)時(shí)間點(diǎn)內(nèi)ID的唯一性。
優(yōu)缺點(diǎn)
不管是老版本還是新版本,MongoDB的ObjectId至少都可以保證集群內(nèi)的唯一,我們可以搭建一個(gè)全局唯一ID生成的服務(wù),利用MongoDB生成ObjectId并對(duì)外提供服務(wù)(MongoDB的各語(yǔ)言驅(qū)動(dòng)都實(shí)現(xiàn)了ObjectId的生成算法)。
優(yōu)點(diǎn):MongoDB的性能不錯(cuò),可以使用集群部署,保證其高可用;ID內(nèi)自帶一些含義,比如時(shí)間戳,必要的時(shí)候可以進(jìn)行反解;
缺點(diǎn):和數(shù)據(jù)庫(kù)一樣,需要引入對(duì)應(yīng)的組件/軟件,增加了系統(tǒng)的復(fù)雜度;最關(guān)鍵的是,這兩種方案都意味著生成全局唯一ID的系統(tǒng)(服務(wù)),會(huì)成為一個(gè)單點(diǎn),在軟件架構(gòu)中,單獨(dú)就意味著風(fēng)險(xiǎn);如果這個(gè)服務(wù)出現(xiàn)問(wèn)題,那么所有依賴于這個(gè)服務(wù)的系統(tǒng)都會(huì)崩潰掉。
我將持續(xù)分享Java開發(fā)、架構(gòu)設(shè)計(jì)、程序員職業(yè)發(fā)展等方面的見(jiàn)解,希望能得到你的關(guān)注。