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