前天和朋友在一起聊天砾医,聊到在做什么俗壹,聽著他滔滔不絕地,真佩服他的記憶力藻烤,后面他說他都有記筆記的習(xí)慣绷雏,一篇篇的,什么CSDN怖亭、javaeye涎显、博客園,還自建博客兴猩。確實東西做久了期吓,自然慢慢地也就淡忘了,回想一下以前做過的事倾芝,能記起來的還真屈指可數(shù)讨勤。
看看上次寫博文的時間是在2013年8月27日,距今已經(jīng)4年了晨另,這4年我在干什么潭千????
今天就說說支付服務(wù)的那些事吧借尿。以此來緬懷過去的創(chuàng)業(yè)經(jīng)歷刨晴。
系統(tǒng)演進
新的業(yè)務(wù)系統(tǒng)初建時屉来,業(yè)務(wù)邏輯相對簡單,業(yè)務(wù)量也比較小狈癞,為了能夠快速實現(xiàn)功能茄靠,發(fā)布上線,大多數(shù)團隊都會把所有的邏輯都耦合在一個系統(tǒng)蝶桶。這對于初期業(yè)務(wù)的快速迭代是有一定好處的慨绳。毫不例外,前公司的支付交易系統(tǒng)也采用了這樣的方式真竖。
單體架構(gòu)簡便快速脐雪,然而這種架構(gòu)的缺點也很明顯,姑且不說高并發(fā)訪問疼邀,邏輯分散喂江,隨著需求的迭代召锈,后期難以維護旁振。初接項目,問題很多涨岁,每天就是排查問題拐袜,和第三方確認(rèn)交易等。好在深陷泥濘不久梢薪,就開始著手新支付服務(wù)設(shè)計實現(xiàn)蹬铺。那么,支付要解決的問題有哪些呢秉撇?
解決的問題
做支付服務(wù)也有兩年多了甜攀,總結(jié)下支付服務(wù)要解決的有哪些問題。
- 最原始和核心的需求琐馆,資金流動规阀。
- 高可用。全天候提供服務(wù)瘦麸。需要解決如下問題:
? ? ? ? - 多機谁撼。熱發(fā)布。
? ? ? ? - 通信異匙趟牵或超時厉碟。異常的交易如何保證交易最終一致性。
? ? ? ? - 防雪崩屠缭。渠道偶也會有抽風(fēng)時箍鼓,他們抽風(fēng)了,我們可不能跟著抽風(fēng)呵曹“乐龋快速熔斷,防止大量資源(連接)被暫用。
? ? ? ? - 通知下游服務(wù)失敗或異常時之剧,重試通知郭卫。
- 易用性。滿足各種業(yè)務(wù)需求背稼,各業(yè)務(wù)系統(tǒng)調(diào)用只需提供少量必要信息即可贰军,接口簡單、調(diào)用方便蟹肘。
- 簡單風(fēng)控词疼。對交易做校驗,識別并阻止誤交易或惡意交易帘腹。
- 防止重復(fù)交易贰盗。不用的業(yè)務(wù)場景,對重復(fù)扣款要求不一阳欲。對于同一用戶下同一業(yè)務(wù)的扣款舵盈,交易發(fā)起方可能會有多個,如:用戶自動發(fā)起球化、工作人員介入發(fā)起秽晚、系統(tǒng)定時扣款發(fā)起,即會下多個支付訂單筒愚,然由于業(yè)務(wù)要求多個支付訂單只能有一筆支付成功赴蝇。如何保證不會多扣用戶的錢,即需要防止對同一業(yè)務(wù)下的支付訂單重復(fù)扣款巢掺。而有些業(yè)務(wù)(如充值)又沒有此限制句伶。
- 支付路由。為保證服務(wù)的穩(wěn)定可靠陆淀,一般會接入多個支付渠道互備考余。多個支付渠道,如何個性化選擇倔约?一般考慮路由的的因素有如下:
? ? ? ? ?- 不同業(yè)務(wù)對支付渠道有特殊要求秃殉。
? ? ? ? ?- 同一業(yè)務(wù)不同時期對支付渠道有特殊要求。
? ? ? ? ?- 支付渠道有個人問題(卡掛失浸剩、卡過期钾军、交易金額超個人設(shè)置限額、未知異常等)和渠道問題(渠道下某個銀行未開通或交易金額超渠道設(shè)置限額绢要、渠道跪了吏恭、渠道對個人余額不足做次數(shù)限制等)導(dǎo)致不可用。
? ? ? ? ?- 不同渠道費率可能不盡相同,省錢省錢省錢。
? ? ? ? ?- 一般會將費率高的渠道作為備用冻押,然而作為合作備胎也是有尊嚴(yán)的棒假,你也是要時不時撩一下,給下希望考抄,所以每天也得保證一定的交易量捺弦。
- 需求迭代躬存。由于業(yè)務(wù)的特殊性茄唐,需求一直在迭代息裸,經(jīng)常需要接入新渠道。如何滿足快速的需求迭代沪编?如何讓新人快速高效投產(chǎn)呼盆?系統(tǒng)架構(gòu)要合理,高內(nèi)聚低耦合蚁廓。自動化測試釋放重復(fù)性的一些測試工作访圃。
- 監(jiān)控與預(yù)警。要保證系統(tǒng)的高可靠和高可用相嵌,監(jiān)控必不可少腿时。業(yè)務(wù)上,監(jiān)控異常的交易平绩。監(jiān)控銀行和渠道的可用性圈匆。手續(xù)費預(yù)警漠另,避免坐扣發(fā)生捏雌。系統(tǒng)運行情況監(jiān)控等。
- 資源分配笆搓。按交易來源的不同性湿,交易可以分為兩類:一類是用戶發(fā)起,一類是系統(tǒng)定時批量交易满败。用戶發(fā)起的交易一定得先得到保證肤频,然后又要兼顧系統(tǒng)定時批量交易。
- 異常交易快速發(fā)現(xiàn)及處理算墨。系統(tǒng)難免有異常交易的情況發(fā)生宵荒。如交易超時、回盤超時净嘀、渠道或銀行系統(tǒng)抽風(fēng)报咳、掉單等。如何快速發(fā)現(xiàn)異常交易并快速修復(fù)異常挖藏。
- 動態(tài)配置暑刃。渠道或銀行系統(tǒng)難免會有維護的時候,尤其銀行節(jié)假日經(jīng)常會有升級維護膜眠。維護期間或者他們的服務(wù)是不可用的岩臣,或者限制交易限額等等溜嗜。智能路由也有如權(quán)重優(yōu)先級等一些配置,等等此類的配置都是需要動態(tài)維護的架谎。
- 全局異常處理炸宵。各業(yè)務(wù)調(diào)用方式不一,有RESTFUL接口DUBBO接口等谷扣。如何保證異常處理的一致性焙压。
- 支付結(jié)果個性化通知。由于支持了不同的業(yè)務(wù)抑钟,而不同業(yè)務(wù)的后續(xù)處理方式是不同的涯曲,需要個性化通知下游系統(tǒng)。
- Fail fast在塔。分布式系統(tǒng)幻件,要對每個模塊系統(tǒng)的可用性持懷疑態(tài)度,當(dāng)出現(xiàn)某個系統(tǒng)不可用時(如發(fā)包)蛔溃,要能快速優(yōu)雅地結(jié)束整個流程绰沥。這點設(shè)計出問題時可能會幫你避免影響的進一步擴大。舉個例子贺待,服務(wù)出現(xiàn)過僅有的兩次事故徽曲,一次是路由服務(wù)機子磁盤滿了,一次是網(wǎng)絡(luò)問題麸塞,導(dǎo)致異常交易發(fā)生秃臣,“Fail fast”避免了雪崩效應(yīng),同時保證了交易的一致性哪工,避免人工修數(shù)據(jù)情況的發(fā)生奥此,為服務(wù)的快速恢復(fù)提供了可能(從問題發(fā)現(xiàn)到服務(wù)恢復(fù),均在十分鐘左右)雁比。
- 埋點稚虎。涉及錢的,應(yīng)該是一件很嚴(yán)肅的事偎捎。任何系統(tǒng)都會存在BUG蠢终,所以交易需要進行必要的埋點用于追蹤問題交易。
- 限制資源的使用茴她。對于資源使用的限制設(shè)計是高可用系統(tǒng)最重要的一點寻拂,也是容易被忽略的一點,資源相對有限败京,用的過多了兜喻,自然會導(dǎo)致應(yīng)用宕機。一般有如下限制:
? ? ? ? - 限制連接數(shù)
? ? ? ? - 限制線程創(chuàng)建
? ? ? ? - 限制并發(fā)
? ? ? ? - 限制內(nèi)存的使用
- 狀態(tài)碼的學(xué)習(xí)赡麦。第三方支付渠道返回的狀態(tài)碼偶爾會變更(推測是第三方會切換渠道或者接入新的渠道)朴皆,而新增的新狀態(tài)碼第三方往往通知不及時甚至不通知帕识,新狀態(tài)碼在未能判定成功或失敗的情況下,是個未知狀態(tài)(寧可未知也不能誤判遂铡。這一點很重要肮疗,很多第三方在處理和銀行或其他第三方時,出現(xiàn)通訊超時或者未知狀態(tài)碼后就返回失敗扒接,這導(dǎo)致了很多掉單情況的發(fā)生伪货,踩了很多這樣的坑...),如何快速發(fā)現(xiàn)并學(xué)習(xí)新狀態(tài)碼的含義钾怔?
總之碱呼,需求很明確,就是適應(yīng)互聯(lián)網(wǎng)應(yīng)用的場景宗侦,也沒啥特別之處愚臀。后面有時間再理一下系統(tǒng)的演進實現(xiàn)吧。