自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一份詳盡的支付平臺高可用架構(gòu)設(shè)計實踐

開發(fā) 架構(gòu) 開發(fā)工具
我在前一家公司的第一個任務(wù)是開發(fā)統(tǒng)一支付平臺,由于公司的業(yè)務(wù)需求,需要接入多個第三方支付。

我在前一家公司的***個任務(wù)是開發(fā)統(tǒng)一支付平臺,由于公司的業(yè)務(wù)需求,需要接入多個第三方支付。

[[269157]]

圖片來自包圖網(wǎng)

之前公司的支付都是散落在各個項目中,極其不利于支付的管理,于是聚合三方支付,統(tǒng)一支付平臺的任務(wù)就落在我手上。

可以說是完全從 0 開始設(shè)計,經(jīng)過一番實戰(zhàn)總結(jié),我得出了一些架構(gòu)設(shè)計上的思考。

之前就一直很想把自己的架構(gòu)設(shè)計思路寫出來,但一直沒動手,前幾天在技術(shù)群里有人問到相關(guān)問題,我覺得有必要把它寫出來,以幫助到更多需要開發(fā)支付平臺的開發(fā)人員。

組件模式

由于公司業(yè)務(wù)在很多地區(qū)都有,需要提供多種支付途徑,以滿足業(yè)務(wù)的發(fā)展,所以設(shè)計的支付平臺需要接入多種第三方支付渠道,如:微信支付、支付寶支付、PayPal、IPayLinks 等等。

我們都知道,每個第三方支付,都有自己的一套對外 API,官方都有一套 SDK 來實現(xiàn)這些 API,我們應(yīng)該如何組織這些 API 呢?

由于第三方支付渠道會隨著業(yè)務(wù)的發(fā)展變動,所以組織這些 SDK 就需要在不影響支付平臺整體架構(gòu)的前提下可靈活插拔。

這里我使用了組件的思想,將支付 API 拆分成各種組件支付組件、退款組件、訂單組件、賬單組件等等。

那么這樣就可以當(dāng)引入一個第三方支付 SDK 時,可靈活在組件上面添加需要的 API,架構(gòu)設(shè)計如下:

通過 Builder 模式根據(jù)請求參數(shù)構(gòu)建對應(yīng)的組件對象,將組件與外部分離,隱藏組件構(gòu)建的實現(xiàn)。組件模式+Builder 模式使得支付平臺具備了高擴展性。

多賬戶體系

在接入各種第三方支付平臺時,我們又遇到一個賬戶的問題,原因是公司當(dāng)時的小程序與 App 使用的是不同的微信賬號,因此會出現(xiàn)微信支付會對應(yīng)到多個賬戶的問題。

而我設(shè)計支付平臺時,沒有考慮到這個問題,當(dāng)時第三方支付只對應(yīng)了一個賬戶,而且不同的第三方支付的賬戶之間相互獨立且不統(tǒng)一。

于是我引入了多賬戶體系,多賬戶體系最重要的一個核心概念是以賬戶為粒度,接入多個第三方支付,統(tǒng)一賬戶的參數(shù),構(gòu)建了統(tǒng)一的支付賬戶體系。

支付平臺無需關(guān)心不同支付之間的賬戶差異以及第三方支付是否有多少個賬戶。

此時我在支付平臺架構(gòu)圖加上賬戶層:

前端只需要傳遞 AccountId,支付平臺就可以根據(jù) AccountId 查詢出對應(yīng)的支付賬戶。

然后通過 Builder 模式構(gòu)建支付賬戶對應(yīng)的組件對象,完全屏蔽不同支付之間的差異。

在多賬戶體系里面,可以支持***多個支付賬戶,完全滿足了公司業(yè)務(wù)的發(fā)展需求。

統(tǒng)一回調(diào)與異步分發(fā)處理

做過支付開發(fā)的同學(xué)都知道,目前的第三方支付都有一個特點,就是支付/退款成功后,會有一個支付/退款回調(diào)的功能,目的是為了讓商戶平臺自行校驗該筆訂單是否合法。

比如:防止在支付時,客戶端惡意篡改金額等參數(shù),那么此時支付成功后,訂單會處于支付中狀態(tài),需要等待第三方支付的回調(diào)。

如果此時收到了回調(diào),在校驗時發(fā)現(xiàn)訂單的金額與支付的金額不對,然后將訂單改成支付失敗,以防止資金損失。

回調(diào)的思想是保證最終的一致性,所以我們調(diào)起支付時,并不需要在此時校驗參數(shù)的正確性,只需要在回調(diào)時校驗即可。

講完了回調(diào)的目的,那么我們?nèi)绾蝸碓O(shè)計支付平臺的回調(diào)呢?由于支付平臺接入了多個第三方支付,如果此時每個第三方支付設(shè)置一個回調(diào)地址,那么將會出現(xiàn)多個回調(diào)地址。

由于回調(diào)的 API 必須是暴露出去才能接受第三方的回調(diào)請求,所以就會有安全問題。

我們必須在 API 外層設(shè)置安全過濾,不然很容易出現(xiàn)一些非法訪問暴力破解,所以我們需要統(tǒng)一回調(diào) API,統(tǒng)一做安全校驗,之后再進行一層分發(fā)。

分發(fā)的機制我這里建議用 RocketMQ 來處理,可能有人會問,如果用 RocketMQ 來做分發(fā)處理,此時怎么實時返回校驗結(jié)果到第三方支付呢?

這個問題也是我當(dāng)時一直頭疼的問題,以下是我對回調(diào)設(shè)計的一些思考:

①公司的系統(tǒng)是基于 Spring Cloud 微服務(wù)架構(gòu),微服務(wù)之間通過 HTTP 通信,當(dāng)時有很多個微服務(wù)接入了我的支付平臺,如果用 HTTP 作分發(fā),可以保證消息返回的實時性。

但也會出現(xiàn)一個問題,由于網(wǎng)絡(luò)不穩(wěn)定,就會出現(xiàn)請求失敗或超時的問題,接口的穩(wěn)定性得不到保障。

②由于第三方支付如果收到 False 響應(yīng),就在接下來一段時間內(nèi)再次發(fā)起回調(diào)請求。

這么做的目的是為了保證回調(diào)的成功率,對于第三方支付來說,這沒毛病,但對于商戶支付平臺來說,也許就是一個比較坑爹的設(shè)計。

你想一下,假設(shè)有一筆訂單在支付時惡意篡改了金額,回調(diào)校驗失敗,返回 False 到第三方支付,此時第三方支付會再重復(fù)發(fā)送回調(diào),無論發(fā)送多少次回調(diào),都會校驗失敗。

這就額外增加了不必要的交互,當(dāng)然這里也可以用冪等作處理,以下是微信支付回調(diào)的應(yīng)用場景說明:

基于以上兩點思考,我認為返回 False 到第三方支付是沒必要的,為了系統(tǒng)的健壯性,我采用了消息隊列來做異步分發(fā),支付平臺收到回調(diào)請求后直接返回 True。

這時你可能會提出一個疑問,如果此時校驗失敗了,但此時返回 true,會不會出現(xiàn)問題?

首先,校驗失敗情況,訂單必定是處于支付失敗的狀態(tài),此時返回 True 的目的是為了減少與第三方支付不必要的遠程交互。

因為 RocketMQ 的消息是持久化到磁盤的,所以用消息隊列來做異步分發(fā)***的好處,就是可以復(fù)查消息隊列里面的消息來排查問題,而且消息隊列可以在業(yè)務(wù)的高峰期進行流量削峰。

以下是統(tǒng)一回調(diào)與分發(fā)處理的架構(gòu)設(shè)計圖:

聚合支付

支付平臺聚合了多種第三方支付,因此在請求層需要做很多的適配工作,以滿足多種支付的需求。

可能你會想,直接在適配那里加幾行 if else 不就得了嗎,這么做也沒問題,也可以滿足多種支付的需求,但你有沒有想過,假設(shè)此時再加一個第三方支付,你會怎么做?

你只能在原有方法上加多個 else 條件,這樣就會導(dǎo)致請求層代碼不斷地隨著業(yè)務(wù)發(fā)展改變,使得代碼極其不優(yōu)雅,而且也不好維護。

這時我們就得用上策略模式,將這些 if else 代碼消除,當(dāng)我們增加一個第三方支付時,我們只需要新建一個 Strategy 類就可以了,策略模式究竟怎么使用可以看看大話設(shè)計模式。

因此我在 Builder 模式前加多了一層支付策略層:

請求處理

由于支付平臺涉及到資金,支付的各種請求與返回,以及異常記錄在一個支付平臺中異常重要,因此我們需要記錄每一次的支付請求記錄,以便后續(xù)排查問題。

基于這點需求,我在開始請求第三方支付之前,設(shè)計了一層 Handler 層,所有的請求都必須經(jīng)過 Handler 層進行處理,Handler 核心方法如下:

  1. public K handle(T t) { 
  2.   K k; 
  3.   try { 
  4.     before(t); 
  5.     k = execute(t); 
  6.     after(k); 
  7.   } catch (Exception e) { 
  8.     exception(t, e); 
  9.   } 
  10.   return k; 
  11. protected abstract void before(T t); 
  12. protected abstract void after(K k); 
  13. protected abstract void exception(T t, Exception exception); 

原則上來說,我設(shè)計的 Handler 層,利用了模版模式,不僅僅可以實現(xiàn)日志的記錄,還可以實現(xiàn)多種處理方式,比如請求監(jiān)控,消息推送等等,實現(xiàn)了 Handler 層的高擴展性。

以下是 Handler 層的架構(gòu)設(shè)計圖:

寫在***

以上就是我的支付平臺架構(gòu)設(shè)計思路,總結(jié)來說,支付平臺需要具備可擴展性、穩(wěn)定性、高可用性。

因此我在設(shè)計支付平臺時使用了很多設(shè)計模式以及引入消息隊列處理回調(diào)分發(fā)的問題,使得支付平臺具備這幾點特性。

希望能夠給你一些啟發(fā)與幫助,***我把支付平臺整體的架構(gòu)設(shè)計圖貼出來:

 

責(zé)任編輯:武曉燕 來源: 后端進階
相關(guān)推薦

2020-07-14 15:10:21

Redis架構(gòu)代碼

2019-06-13 18:50:47

支付平臺架構(gòu)設(shè)計

2021-03-09 20:52:01

架構(gòu)無狀態(tài)服務(wù)

2020-04-22 14:25:48

云開發(fā)高可用架構(gòu)

2020-07-10 08:50:37

大數(shù)據(jù)銀行技術(shù)

2021-04-28 08:52:22

高并發(fā)架構(gòu)設(shè)高并發(fā)系統(tǒng)

2025-03-03 04:20:00

高可用架構(gòu)冗余法則

2018-05-16 09:00:00

物聯(lián)網(wǎng)物聯(lián)網(wǎng)平臺IoT

2015-12-16 11:27:52

Google高可用架構(gòu)

2021-02-24 10:05:07

架構(gòu)運維技術(shù)

2022-09-28 17:59:03

MQ消息中間件

2015-09-21 15:00:54

聯(lián)想OpenStack企業(yè)云平臺

2017-09-13 13:42:09

微服務(wù)緩存架構(gòu)

2019-12-24 09:30:59

蘇寧高可用高并發(fā)

2017-10-10 15:20:10

架構(gòu)數(shù)據(jù)存儲PB級數(shù)據(jù)

2019-08-27 09:20:35

微服務(wù)架構(gòu)組件

2023-03-27 08:05:27

數(shù)字化轉(zhuǎn)型MLOps

2016-03-25 09:57:09

統(tǒng)一監(jiān)控報警平臺運維

2017-10-27 14:52:31

互聯(lián)網(wǎng)高可用架構(gòu)高可用

2021-06-24 08:30:08

架構(gòu)億級消息中心數(shù)據(jù)
點贊
收藏

51CTO技術(shù)棧公眾號