微信支付的系統(tǒng)架構到底有多厲害?

源 /cnblog 文 / jack jiang


背 景
容易出 Bug
通過溝通保證不了質量
需求變更迭代周期長
數(shù)據(jù)上報不全面
缺少業(yè)務及設計知識沉淀
協(xié)議管理松散
缺少統(tǒng)一的自動化測試

C++ 的跨平臺框架,并對核心支付流程進行了重構。
線上效果指標

跨平臺實現(xiàn):iOS + 安卓 共計 3 人日,在封板時間前完成
原生實現(xiàn):iOS, 安卓封板時間后一周才基本完成
跨平臺實現(xiàn):iOS + 安卓共計 5 人日,在封板時間前完成
原生實現(xiàn):iOS, 安卓封板時間后一周才基本完成


微信支付的軟件架構
MVC,MVVM 等。
從零到一構建支付跨平臺軟件架構
C++ 來編寫業(yè)務代碼,并沒有成熟的架構。即使使用 C++ 編寫業(yè)務邏輯,但都不涉及 UI,不涉及界面的跳轉流程。現(xiàn)在業(yè)界通用的有 MVC , MVP, MVVM 。這些大家都熟悉的軟件架構。但是這些軟件架構都存在一個問題:那就是沒有處理好業(yè)務流程, 界面轉場。
MVC 這種架構的話,很快代碼會變得難以維護。
UseCase。同時, 把界面抽象為 UIPage。一個大的業(yè)務流程可以分解為一個個小的業(yè)務流程。
業(yè)務流程的代碼能夠聚合到 UseCase 中,而不是分散到原來 iOS, 安卓的各個 ViewController,Activity 中。
業(yè)務流程和界面得到了復用。
契合微信支付多流程,界面跳轉復雜的業(yè)務特點。
2、加入路由機制
流程之間,頁面之間的流傳。

本文中的名詞 CGI可以理解為一個網(wǎng)絡請求,類似HTTP請求。
特殊流程的處理



那么怎么建立這個支付領域模型的呢?



統(tǒng)一了流程,頁面的流轉。清晰,易維護。
統(tǒng)一了特殊流程的處理,減少重復工作。
在加入路由機制的時候,結合微信支付和網(wǎng)絡密切相關的特點進行了支付領域建模。支付后臺協(xié)議重構 2.0 的核心思想也是圍繞著這個路由機制展開。

3、管理網(wǎng)絡請求

CGI 一對多通訊問題。

進入錢包頁面后,發(fā)起了一個 Cgi
然后進入收付款頁面也發(fā)起同一個 Cgi.
如果收付款發(fā)起的回包先到
然后錢包首頁的回包再到。
CGI 生命周期問題。

將 Cgi 抽象為獨立對象

劃分職責,明確生命周期

杜絕了一對多通信造成的 Bug
生命周期和業(yè)務邏輯綁定,不會出現(xiàn)業(yè)務結束,Cgi 回來后再觸發(fā)動作。
高內聚,低耦合。將 Cgi 相關的數(shù)據(jù),能力集中處理,業(yè)務側無需感知。
提供統(tǒng)一的緩存,加密能力。



4、 規(guī)范數(shù)據(jù)傳遞

進入支付首頁時,后臺返回了數(shù)據(jù),然后被寫入到一個公共的 Model.
然后進入錢包頁,再進入零錢頁。這個公共 model 一路被傳遞過去。
然后零錢頁讀取了公共 Model 的數(shù)據(jù),但是代碼無法處理,導致出現(xiàn)了這個讓用戶恐慌的問題。

存在公共讀寫的數(shù)據(jù)類型。
無序的數(shù)據(jù)流動。

去掉公共讀寫的數(shù)據(jù)類型
傳遞值類型(Value Type)的數(shù)據(jù), 后面流程修改數(shù)據(jù)時,不影響前面的流程。
單向傳遞數(shù)據(jù),只依賴注入必要數(shù)據(jù)。
如果數(shù)據(jù)修改需要通知前序流程,使用代理模式通訊。
從架構上根本解決了困擾微信支付已久的數(shù)據(jù)污染的問題。
數(shù)據(jù)的流動變?yōu)閱蜗颍瑪?shù)據(jù)流動變得可追溯。


總結
— 完 —
長按進入小程序,進行打卡簽到
(更多精彩值得期待……)
最近熱文: 一周內被程序員瘋轉5.6W次,最終被大廠封殺! 試用期沒過,因在公司上了 1024 網(wǎng)站... 最新 955 互聯(lián)網(wǎng)公司白名單來了! 再厚的馬賽克都能被扒干凈?這款去碼神器火了 LeetCode1-180題匯總,希望對你有點幫助! 2T技術資源大放送!包括但不限于:C/C++,Linux,Python,Java,人工智能,考研,軟考,英語,等等。在公眾號內回復「資源」,即可免費獲取!回復「社群」,可以邀請你加入讀者群! ??給個「在看」,是對我最大的支持??


