选单大厅架构分享
需求背景
? ? ? ? ?即時(shí)單:? 訂單超過一定時(shí)間未派單成功,進(jìn)入即時(shí)單大廳,滿足'特定過濾條件'的司機(jī)可查看并搶單
? ? ? ? ?預(yù)約單:? 訂單超過一定時(shí)間未派單成功,進(jìn)入預(yù)約單大廳,滿足'可發(fā)送搶單通知條件'的司機(jī)可查看并搶單
? ? ? ? ?獎(jiǎng)勵(lì):? 對于通過搶單大廳搶單成功的訂單,給予司機(jī)在價(jià)格等方面一定程序的獎(jiǎng)勵(lì)
feed流系統(tǒng)架構(gòu) (臉書|推特|微博|知乎)
? ? ? ? ?粉絲關(guān)注大V,大V發(fā)布文章(或動態(tài)),粉絲feed流中顯示。
? ? ? ? ?派單系統(tǒng)推送訂單到選單大廳,司機(jī)在feed流(選單大廳展示列表)中查看或操作訂單。
? ? ? ? ?比較:? 都是在解決發(fā)布訂閱關(guān)系,臉書等feed流訂閱關(guān)系比較穩(wěn)定且是主動的,設(shè)計(jì)難點(diǎn)在存儲,長尾,熱點(diǎn),延遲,海量數(shù)據(jù)存在性等
? ? ? ? ? ? ? ? ? ? ? 選單大廳feed流,訂閱關(guān)系是動態(tài)的,被動的,更強(qiáng)調(diào)及時(shí)性
發(fā)布訂閱關(guān)系動態(tài)性(選單大廳→司機(jī))
? ? ? ? ?即時(shí)單: 每輪在篩選司機(jī)的過程中,重新確定訂單的粉絲列表(即訂閱訂單的司機(jī))
? ? ? ? ?預(yù)約單: 選單大廳觸發(fā),每隔1min ,重新確定訂單的粉絲列表
選單大廳技術(shù)架構(gòu)一: 推模式
? ? ? ? ?比較容易想到的架構(gòu)是拉模式,司機(jī)查看feed流時(shí),主動拉取滿足條件的訂單,類似于反向綁單。派單系統(tǒng)處理流程更傾向于訂單->司機(jī),對司機(jī)->訂單這種逆操作支持不友好。
? ? ? ? ?推模式更加有利于兼容派單系統(tǒng),即派單系統(tǒng)復(fù)雜推送訂閱訂單的司機(jī)列表,在選單大廳中每個(gè)司機(jī)維系一個(gè)feed流,選單大廳系統(tǒng)接收到訂單&司機(jī)關(guān)系時(shí),對相關(guān)司機(jī)的feed流進(jìn)行增改刪查操作。
? ? ? ? ?實(shí)例:? 動態(tài)調(diào)整訂閱關(guān)系
? ? ? ? ? ? ? ? ? ? ? 1.??B210126232438522000? ? ? ? ? ? ? ?訂閱司機(jī)【1775854,1071992,3550032,1197190】
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 在【1775854,1071992,3550032,1197190】的feed流中增加B210126232438522000?
? ? ? ? ? ? ? ? ? ? ? 2.??B210126232438522000? ? ? ? ? ? ? ?訂閱司機(jī)【? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?3550032,1197190,1128406,1371028】
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 在【1775854,1071992】的feed流中刪除B210126232438522000,在【1128406,1371028】的feeds流中增加B210126232438522000
? ? ? ? ?存在的問題:每個(gè)訂單的訂閱者限制在N,司機(jī)的feed流存儲結(jié)構(gòu)使用redis的set,理論上每次新建或調(diào)整訂閱關(guān)系涉及到N條set操作。當(dāng)并發(fā)度較大時(shí),影響較大
選單大廳技術(shù)架構(gòu)二: 推拉結(jié)合
? ? ? ? ?單向存儲訂單->司機(jī)的關(guān)系,使用推。司機(jī)獲取feed流時(shí),直接從存儲的訂單-司機(jī)關(guān)系中,反查出司機(jī)-訂單關(guān)系,即關(guān)系的創(chuàng)建及更新使用推,而feed流的獲取使用拉。
? ? ? ? ?redis使用string數(shù)據(jù)結(jié)構(gòu),存儲訂單→司機(jī)關(guān)系,為了降低頻繁批量get操作給帶寬產(chǎn)生的壓力,本地內(nèi)存中存儲訂單與司機(jī)關(guān)系備份,從訂單→司機(jī)的關(guān)系 到司機(jī)→訂單關(guān)系的轉(zhuǎn)換,完全基于內(nèi)存操作。
? ? ? ? ?相對于架構(gòu)一優(yōu)勢:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1.不需要存儲司機(jī)的feed流信息,節(jié)省了大量的redis空間(架構(gòu)一即使司機(jī)不使用選單大廳,仍然要存儲feed流信息)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2.極大的減少了redis復(fù)雜數(shù)據(jù)類型的訪問頻次,降低于redis的壓力
? ? ? ? ?需要思考的問題:? 1.本地維系選單大廳的訂單→司機(jī)關(guān)系,如何初始化?? * (風(fēng)險(xiǎn)點(diǎn),當(dāng)開城數(shù)|訂單數(shù)激增時(shí),會導(dǎo)致項(xiàng)目啟動緩慢)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.本地存儲關(guān)系的容器選擇及更新策略,涉及到線程安全等
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3.訂單→ 司機(jī) 關(guān)系轉(zhuǎn)化為 司機(jī)?→ 訂單的性能考慮 (城市大廳訂單量1000,每個(gè)訂單映射的司機(jī)數(shù)1000,本地環(huán)境測試耗時(shí)約20ms)
選單大廳技術(shù)選型
? ? ? ? ??并發(fā)容器技術(shù)選型
? ? ? ? ? 更新策略技術(shù)選型?
? ? ? ? ? ? ? ? ? ? ?鍵事件通知? ?
? ? ? ? ? ? ? ? ? ? ?rocketmq廣播隊(duì)列
? ? ? ? ? ? ? ? ? ? ?redis消息隊(duì)列(發(fā)布訂閱模式)
? ? ? ? ? ? ? ? ? ? ?配置中心配置項(xiàng)目集群信息,http通知
? ? ? ? ? ? ? ? ? ? ?zk
? ? ? ? ? ? ? ? ? ? ?redis#blpop
?
總結(jié)
- 上一篇: Linux 服务器安装、配置和维护,一文
- 下一篇: iPhone 8 和 8 Plus 发布