一個(gè) webman 項(xiàng)目,用到了 redis 隊(duì)列,該項(xiàng)目部署到 A 和 B 兩臺服務(wù)器,這樣的話,A 和 B 都會同時(shí)消費(fèi)隊(duì)列吧?假如從隊(duì)列 pop 后要寫入 MySQL,那可能寫入庫的順序就不是入隊(duì)的順序了。如果有嚴(yán)格的消費(fèi)順序要求,多機(jī)部署 webman 項(xiàng)目時(shí),怎么保證消費(fèi)的順序正確呢?可以設(shè)置只在其中一臺服務(wù)器上消費(fèi)嗎?
謝謝~
Laravel 的任務(wù)調(diào)度有限制只在一臺服務(wù)器執(zhí)行的方法:
https://learnku.com/docs/laravel/8.x/scheduling/9399#d9201c
webman只能保證按順序從隊(duì)列里取數(shù)據(jù),至于業(yè)務(wù)消費(fèi)后插入數(shù)據(jù)庫的時(shí)機(jī),這完全是由你們業(yè)務(wù)代碼控制的,webman沒辦法控制。
即使只用一臺服務(wù)器消費(fèi),多個(gè)消費(fèi)進(jìn)程也是并發(fā)執(zhí)行的,和多服務(wù)器沒有實(shí)質(zhì)區(qū)別。除非你單機(jī)單進(jìn)程消費(fèi),那么入庫肯定是嚴(yán)格按照消費(fèi)順序來的。
我覺得最好的方案就是業(yè)務(wù)自己做下處理,比如每個(gè)消息都帶一個(gè)序列號,入庫的時(shí)候按照序列號入庫,查詢的時(shí)候按照序列號排序查詢?;蛘吒鶕?jù)你的業(yè)務(wù)找一個(gè)其它方案。