07 系統(tǒng)面臨的現(xiàn)實問題:第三方客戶系統(tǒng)的對接耦合性太高,經(jīng)常出問題!

系統(tǒng)面臨的現(xiàn)實問題:第三方客戶系統(tǒng)的對接耦合性太高,經(jīng)常出問題!
1、重新觀察訂單支付的核心流程
經(jīng)過了前幾天的培訓,小猛已經(jīng)對目前訂單系統(tǒng)的整體情況有了一個大致了解,而且也知道了系統(tǒng)目前面臨的一些問題,包括一個訂單在支付之前、支付過程中以及支付完成后退款時面臨的一些技術(shù)隱患。
小猛心想,我這幾天每天晚上整理筆記都到半夜,這些東西都理解的滾瓜爛熟了,應該沒什么問題了。
沒想到今天一早,小猛上班之后,又立馬被明哥叫到了小會議室。
明哥進了會議室,二話不說,立馬在小白板上畫出了一個訂單支付時的核心流程圖。
? ? ? ? ? ?

? ? ? ? ? ? ?
小猛說:明哥,怎么又是這個圖啊?這個流程我已經(jīng)滾瓜爛熟了,問題不是很明顯了么,就是支付之后流程里的步驟太多,耗時太長了,這樣非常影響用戶體驗。
明哥微笑著對小猛說:那你覺得這個流程里真的就什么問題都沒了嗎?
小猛內(nèi)心一陣緊張,趕緊又看了一遍,但是看來看去還是沒發(fā)現(xiàn)什么問題。心虛的說道:我感覺沒什么問題了啊。
2、老司機設計系統(tǒng)的必備經(jīng)驗:跟第三方系統(tǒng)打交道
明哥這個時候就開始給小猛解釋起來了,畢竟也不能讓這孩子太緊張了,一般很多年輕工程師,開發(fā)經(jīng)驗沒那么豐富的,都不會意識到系統(tǒng)可能存在的一些技術(shù)隱患。
在訂單支付的時候,大部分核心步驟,其實都是在自己公司的系統(tǒng)里完成的,比如你更新訂單的狀態(tài),是在自己公司的訂單系統(tǒng)內(nèi)部完成的;你扣減庫存,是找自己公司內(nèi)部的庫存系統(tǒng)完成的;你在增加積分的時候,是找自己公司內(nèi)部的積分系統(tǒng)完成的;你在派發(fā)優(yōu)惠券、紅包的時候,是找自己公司內(nèi)部的營銷系統(tǒng)完成的。
但是這些都做完之后,最關(guān)鍵的一個環(huán)節(jié)呢?
商品的出庫發(fā)貨,你找誰?
一般電商公司內(nèi)部都會有自己的倉儲系統(tǒng),管理各種倉庫和商品的發(fā)貨,通常來說會選擇去找一個距離你用戶最近的一個倉庫,然后從里面調(diào)度一些商品進行發(fā)貨,在發(fā)貨的時候還需要調(diào)用第三方物流公司的系統(tǒng),通知物流公司去倉庫里取貨發(fā)貨。
對于物流公司而言,必然會由自己的物流系統(tǒng)收到貨運通知之后,自動通知自己的快遞員或者運輸隊到對方倉庫里取貨,然后去派發(fā)貨物給購買商品的用戶。
所以明哥在支付訂單的核心流程圖里又補充了幾個步驟。
? ? ? ? ? ?

? ? ? ? ? ??
明哥指著上圖的右側(cè)添加的部分說:以前你以為通知倉儲系統(tǒng)發(fā)貨只是一個非常簡單的事情,但是你看看,現(xiàn)在如果一個用戶購買了商品,要把商品送到他的手上,其實還有不少事要做吧?
小猛不好意思的點點頭,心想自己還是經(jīng)驗太淺了,怎么就沒有去多想想呢。
3、到底什么叫做“系統(tǒng)之間的耦合”?
明哥接著說:沒關(guān)系,其實很多年輕工程師在做開發(fā)的時候,往往思維非常的簡單,很多人主要是關(guān)注自己手頭的一些CRUD的工作。但是在復雜的互聯(lián)網(wǎng)系統(tǒng)里,往往不是CRUD那么簡單。
接下來,我就給你解釋一個在系統(tǒng)設計上的一個概念,叫做“系統(tǒng)之間的耦合”
很多人經(jīng)常聽到“耦合”這個詞,一直搞不懂到底什么叫做耦合?
其實這個東西有非常學術(shù)的說法,但如果按照那個來解釋,應該就沒幾個人能聽懂了。所以我會用非常通俗的語言來給你解釋。
舉個例子,比如在我們的訂單支付流程里,訂單系統(tǒng)其實是要調(diào)用很多其他系統(tǒng)的,比如庫存系統(tǒng)、積分系統(tǒng)、營銷系統(tǒng)、倉儲系統(tǒng),等等。
明哥說著,在圖里畫了好幾個系統(tǒng)之間調(diào)用的紅圈。
? ? ? ? ? ?

? ? ? ? ? ??
好,那么我們現(xiàn)在來思考一個問題,假設促銷系統(tǒng)現(xiàn)在有一個接口,專門是讓你調(diào)用了以后派發(fā)優(yōu)惠券的,現(xiàn)在這個接口接收的參數(shù)有5個,你要是調(diào)用這個接口,就必須給他傳遞5個參數(shù)過去,這個是沒的說的。
現(xiàn)在問題來了,負責促銷系統(tǒng)的工程師某一天突然有一個新的想法,他希望改一改這個接口,在接口調(diào)用的時候需要傳遞7個參數(shù)!
一旦他的這個新接口上線了,你還是給他傳5個參數(shù),那么他那里就會報錯,這個派發(fā)優(yōu)惠券的行為就會失敗!
那在這樣的一個情況下應該怎么辦?
很簡單,你作為訂單系統(tǒng)的負責人,必須要配合促銷系統(tǒng)去修改代碼,既然他要7個參數(shù),那么你就必須得在代碼里調(diào)用他的接口的時候傳遞7個參數(shù)。
并且你還得配合他的新接口去進行測試以及部署上線,你必須得圍繞著他轉(zhuǎn),配合他。
明哥說著,在圖里重新畫了兩個小紅圈,代表訂單系統(tǒng)和促銷系統(tǒng)的接口調(diào)用的修改。
? ? ? ? ? ?

? ? ? ? ? ??
在這種情況下,就說明你的訂單系統(tǒng)跟促銷系統(tǒng)是強耦合的。因為促銷系統(tǒng)任何一點接口修改,都會牽扯你圍著他轉(zhuǎn),去配合他, 耗費你們訂單團隊的人力和時間,說明你們兩個系統(tǒng)耦合在一起了。
要動一起動,要靜一起靜,這就是系統(tǒng)間的耦合。
明哥說到這里停頓了一下,看著小猛問:怎么樣,理解了沒有?
小猛若有所思的看著小白板上的兩個紅圈:有點懂了,又有點沒懂,但是確實感覺對“耦合”這兩個字的理解有那么點意思了。
明哥笑了笑:沒關(guān)系,你之所以感覺沒徹底懂,是因為你沒配合其他團隊的兄弟去干一些修改接口之類的破事兒,當你自己一邊在重構(gòu)訂單系統(tǒng),干的熱火朝天,一邊又被迫去花時間配合營銷團隊修改坑爹的接口的時候。。。
明哥停頓了一下,繼續(xù)說:估計你心里一邊在問候人家的直系親屬,一邊狠狠的在你的筆記本上會寫下幾個字,“坑爹的耦合”!從此以后你對“耦合”就會理解深刻,并且深惡痛絕了。
小猛聽完明哥自帶畫面感的一番描述,哈哈大笑,感覺自己對“耦合”的理解又更深了一點。
4、訂單系統(tǒng)有沒有跟第三方物流系統(tǒng)耦合?
接著明哥提出了一個問題:小猛,你現(xiàn)在思考一下,訂單系統(tǒng)有沒有跟第三方物流系統(tǒng)耦合呢?
小猛看著圖,他發(fā)現(xiàn)按照明哥的說法,訂單系統(tǒng)是跟倉儲系統(tǒng)耦合,而倉儲系統(tǒng)又跟第三方物流系統(tǒng)耦合,那么是不是說明,訂單系統(tǒng)也間接的耦合了第三方物流系統(tǒng)?小猛提出了自己的思考。
明哥點點頭說:非常正確,就是如此,你看圖里我畫的幾個紅圈的地方。
? ? ? ?? ?

? ? ? ? ? ??
訂單系統(tǒng)要調(diào)用倉儲系統(tǒng)的接口去發(fā)貨,倉儲系統(tǒng)在接到訂單系統(tǒng)的調(diào)動之后,又要同時去調(diào)用第三方物流系統(tǒng)去生成物流單,通知人家去取貨。
所以在上圖的流程中,必須要等到第三方物流系統(tǒng)返回確認信息之后,倉儲系統(tǒng)才能返回結(jié)果,訂單系統(tǒng)才能結(jié)束對倉儲系統(tǒng)的調(diào)用。
想想看,在這個情況下,訂單系統(tǒng)不就跟倉儲系統(tǒng)、第三方物流系統(tǒng),全部耦合在一起了嗎?
5、跟第三方系統(tǒng)耦合的痛苦:性能差,不穩(wěn)定
接著明哥臉上突然出現(xiàn)了一種非常復雜的表情:痛苦!嫌棄!有厭惡!五味雜陳。。。
為什么這么復雜的情感?明哥接著說:對我們多年設計系統(tǒng)的人來說,跟第三方系統(tǒng)的交互往往是最麻煩的。
因為對于我們自己公司內(nèi)的系統(tǒng),即使他有問題,所有代碼、數(shù)據(jù)庫都在自己公司,你可以去優(yōu)化,你知道他如何運行,你知道問題在哪里,也知道怎么解決。
但是對于第三方系統(tǒng)的調(diào)用,那就不是那么回事了。你不知道他是怎么寫的,甚至他的系統(tǒng)是用Go、C++、PHP寫的都有可能。
那么問題來了,假如你調(diào)用他的接口,結(jié)果他的接口有時候速度很快只要20ms,有時候速度很慢要200ms,有時候調(diào)用很正常,有時候偶爾會調(diào)用失敗幾次,你怎么辦?
你不知道他是如何實現(xiàn)的,不知道他問題在哪里,你更不知道如何解決他的問題,你也沒資格去改動他的代碼。問他們的工程師,人家根本不理你,就說一句:我們系統(tǒng)大部分情況下不是挺好的么!
所以你要記住一點:第三方系統(tǒng),永遠是不能完全信任的,他隨時有可能出現(xiàn)意料之外的性能變差、接口失敗的問題。
這就是你的系統(tǒng)跟第三方系統(tǒng)耦合在一起的痛苦:對方不可控,導致你的系統(tǒng)的性能和穩(wěn)定性也不可控。
6、小猛的頓悟:第三方系統(tǒng)的耦合給訂單系統(tǒng)帶來了不確定性
小明聽到這里,立馬腦子里有一種頓悟的感覺,他跟著說,那豈不是我們的訂單系統(tǒng)調(diào)用倉儲系統(tǒng),接著調(diào)用第三方物流系統(tǒng),很可能被第三方系統(tǒng)給拖累?
萬一他的性能突然降低,我們的系統(tǒng)性能就降低了,萬一他接口突然調(diào)用失敗,我們的這次操作也會失敗,后續(xù)還要考慮重試機制?
明哥點點頭:說的沒錯,所以在我們訂單支付的核心流程里,其實還有這么一個技術(shù)隱患,耦合第三方系統(tǒng)帶來的不確定性,也是需要后續(xù)我們?nèi)ソ鉀Q的。
小猛今天感覺又是慢滿滿的收獲,若有所思的走出了會議室,決定今晚好好的吸收和消化今天學到的東西。
End
專欄版權(quán)歸公眾號儒猿技術(shù)窩所有
未經(jīng)許可不得傳播,如有侵權(quán)將追究法律責任