做法一:使用加鎖操作先占有鎖資源,再占有紅包嗡官。
可以使用分布式全局鎖的方式(各種分布式鎖組件或者數(shù)據(jù)庫(kù)鎖)乳怎,先申請(qǐng) lock 該紅包資源且成功后再做后續(xù)操作饶氏。優(yōu)點(diǎn)是不會(huì)出現(xiàn)臟數(shù)據(jù)問(wèn)題芹橡,某一個(gè)時(shí)刻只有一個(gè)應(yīng)用線(xiàn)程持有 lock毒坛,紅包只會(huì)被至多一個(gè)用戶(hù)搶到,數(shù)據(jù)一致性有保障林说。缺點(diǎn)是煎殷,所有請(qǐng)求同一時(shí)刻都在搶紅包 A,下一個(gè)時(shí)刻又都在搶紅包 B腿箩,并且只有一個(gè)搶成功豪直,其他都失敗,效率很低珠移。
做法二:?jiǎn)为?dú)開(kāi)發(fā)請(qǐng)求排隊(duì)調(diào)度模塊弓乙。
排隊(duì)模塊接收用戶(hù)的搶紅包請(qǐng)求,以 FIFO 模式保存下來(lái)剑梳,調(diào)度模塊負(fù)責(zé) FIFO 隊(duì)列的動(dòng)態(tài)調(diào)度唆貌,一旦有空閑資源滑潘,便從隊(duì)列頭部把用戶(hù)的訪(fǎng)問(wèn)請(qǐng)求取出后交給真正提供服務(wù)的模塊處理垢乙。優(yōu)點(diǎn)是,具有中心節(jié)點(diǎn)的統(tǒng)一資源管理语卤,對(duì)系統(tǒng)的可控性強(qiáng)追逮,可深度定制酪刀。缺點(diǎn)是,所有請(qǐng)求流量都會(huì)有中心節(jié)點(diǎn)參與钮孵,效率必然會(huì)比分布式無(wú)中心系統(tǒng)低骂倘,并且,中心節(jié)點(diǎn)也很容易成為整個(gè)系統(tǒng)的性能瓶頸巴席。
做法三:巧用 Redis 特性历涝,使其成為分布式序號(hào)生成器。
前文已經(jīng)提到漾唉,紅包系統(tǒng)所使用的紅包數(shù)據(jù)都是預(yù)先生成好的荧库,我們使用數(shù)字 ID 來(lái)標(biāo)識(shí),這個(gè) ID 是全局唯一的赵刑,所有圍繞紅包的操作都使用這個(gè) ID 作為數(shù)據(jù)的關(guān)聯(lián)項(xiàng)分衫。在實(shí)際的請(qǐng)求流量過(guò)來(lái)時(shí),可采用"分組"處理流量的方式般此。
加MQ排隊(duì)蚪战,分庫(kù)分表。
參考:
https://www.infoq.cn/article/solution-to-the-architecture-of-spike-system
https://www.ibm.com/developerworks/cn/web/wa-design-small-and-good-kill-system/index.html