一致性哈希
對節(jié)點(diǎn)和key進(jìn)行hash計算,分布在2^32槽的環(huán)上。
對于節(jié)點(diǎn)比較少的,虛擬節(jié)點(diǎn)防止數(shù)據(jù)傾斜。
性能標(biāo)準(zhǔn)
吞吐量,qps(每秒處理請求數(shù)),tps(每秒處理事務(wù)數(shù))。
rt(請求延遲)。
95線99線就是95%,99%。并發(fā)100,可以達(dá)到80ms延遲,過95線。
id生成方案
id uuuid(32字節(jié))
雪花(8字節(jié) 時間相關(guān))
時鐘回?fù)軉栴},發(fā)現(xiàn)重復(fù)阻塞5ms重試。
或者預(yù)留的值累加避免重復(fù),如果累加到一定程度拋異常。
分布式事務(wù)
2pc,3pc是數(shù)據(jù)庫層面的,而tcc是業(yè)務(wù)層面的。
2pc
協(xié)調(diào)者,參與者。
第一步,協(xié)調(diào)者會發(fā)送給參與者事務(wù)請求,參與者進(jìn)行預(yù)處理,記錄undo,redo日志。
第二步,協(xié)調(diào)者接到全部的返回,通知所有參與者進(jìn)行統(tǒng)一操作。3pc
與2pc類似,把第一步分為兩步,保證參與者執(zhí)行提交或者回滾任務(wù),狀態(tài)是一致的。另外協(xié)調(diào)者和參與者都加了超時檢測機(jī)制,如果協(xié)調(diào)者發(fā)生故障,參與者可以在超時過后,執(zhí)行提交。如果參與者發(fā)生故障,協(xié)調(diào)者收不到參與者的返回,可以繼續(xù)進(jìn)行統(tǒng)一回滾。2pc這兩種情況,都會占用資源,阻塞各參與者的處理。tcc(Try Confirm Cancel)事務(wù)補(bǔ)償
大致分3步,先try一下,根據(jù)try的結(jié)果,確定走confirm或者cancel。
Try 階段去占庫存,Confirm 階段則實(shí)際扣庫存,如果庫存扣減失敗 Cancel 階段進(jìn)行回滾,釋放庫存。
TCC 不存在資源阻塞的問題,因為每個方法都直接進(jìn)行事務(wù)的提交,一旦出現(xiàn)異常通過則 Cancel 來進(jìn)行回滾補(bǔ)償,這也就是常說的補(bǔ)償性事務(wù)。
通常會利用事務(wù)表來記錄事務(wù)提交情況,避免空回滾,懸掛,冪等問題。
空回滾,try超時了執(zhí)行cancel時,應(yīng)該不走業(yè)務(wù),直接return。
在try是插入事務(wù)記錄,cancel時發(fā)現(xiàn)事務(wù)記錄沒有,就插入事務(wù)記錄(避免懸掛問題),return;
懸掛,try超時了執(zhí)行cancel,之后try又執(zhí)行,如果再try方法里執(zhí)行了記錄鎖定,可能就釋放不了鎖了。在執(zhí)行try之前先檢查是否已經(jīng)有事務(wù)記錄了,如果已經(jīng)存在就不執(zhí)行try。
冪等,執(zhí)行前先檢查下是否已經(jīng)存在事務(wù)記錄。mq
保證節(jié)點(diǎn)事務(wù)和消息原子操作,發(fā)給下游,下游也同樣,執(zhí)行任務(wù)返回消息。sega
事務(wù)1,事務(wù)2,事務(wù)3
事務(wù)1回滾操作,事務(wù)2回滾操作,事務(wù)3回滾操作
按個執(zhí)行事務(wù),失敗就執(zhí)行對應(yīng)的回滾操作。