做好一個中臺,需要具備哪些能力?
關(guān)于中臺,現(xiàn)在已經(jīng)爛大街了。隨便幾個微服務(wù)整一整,對外就號稱中臺。但中臺到底是什么?做好中臺需要具備哪些能力?今天我們就來聊一聊中臺。
什么是中臺?
2015 年阿里巴巴提出中臺概念和戰(zhàn)略,從那時候開始「中臺」這個技術(shù)名詞就開始火熱起來,尤其是從 2019 年開始進(jìn)入了爆發(fā)期。前段時間還有一篇關(guān)于阿里拆中臺的文章,刷遍了全網(wǎng)。
在我看來,中臺就是功能的復(fù)用,并且還是業(yè)務(wù)功能的復(fù)用。例如:一個電商公司里,所有系統(tǒng)都需要給用戶發(fā)送消息。如果每個系統(tǒng)都要自行實(shí)現(xiàn)消息發(fā)送,那這個成本就太大了。于是乎就有一個系統(tǒng)專門來做這個事情,實(shí)現(xiàn)「發(fā)送消息」這個業(yè)務(wù)功能的復(fù)用。
如此一來的話,那其實(shí)用微服務(wù)不就可以了,何德何能叫得上中臺呢?
這是一個很好的問題,可以讓我們進(jìn)一步深入思考中臺這個事。
在微服務(wù)時代,消息服務(wù)提供接口出去,各個系統(tǒng)直接調(diào)用發(fā)送就行了。這個時候,系統(tǒng)調(diào)用方與系統(tǒng)提供方之間的通信,還是非常技術(shù)性的,他們之間的通信可能是這樣的:我要發(fā)給 XX 用戶、內(nèi)容是 XX、用 XX 賬號發(fā)送、要發(fā)送的是 XX 語言等等。
對比起微服務(wù),中臺應(yīng)該是微服務(wù)的產(chǎn)品化。比起微服務(wù)方式,中臺的設(shè)計需要抽象出自己的一套業(yè)務(wù)邏輯,屏蔽底層的細(xì)節(jié)。 就拿發(fā)消息這個例子來說:之前是非常簡單地將要發(fā)送的參數(shù)傳遞給消息發(fā)送系統(tǒng),消息發(fā)送系統(tǒng)不做任何封裝。
但對于消息中臺來說,它可能提出一個業(yè)務(wù)編碼的概念,通過業(yè)務(wù)編碼與模板與賬號關(guān)聯(lián)。而對于調(diào)用系統(tǒng)來說,只需要告訴我你需要發(fā)給哪個用戶,發(fā)哪個業(yè)務(wù)的消息即可。至于怎么匹配模板、怎么匹配賬號,調(diào)用方不需要關(guān)心。
總的來說,中臺與微服務(wù)的區(qū)別在于:中臺是對功能的更深層次封裝,可以說是產(chǎn)品層面上的包裝。
說起中臺與微服務(wù)的區(qū)別,可能還不止功能封裝程度上的區(qū)別,可能還有數(shù)據(jù)開放、權(quán)限管控等方面的區(qū)別。對于微服務(wù)來說,其只是簡單的提供一個服務(wù)。如果后續(xù)調(diào)用方的 B 端管理系統(tǒng)需要查詢消息發(fā)送記錄,那么你就會讓一個 B 端系統(tǒng)去查詢一個 C 端系統(tǒng),這明顯不合適。另外,查詢數(shù)據(jù)時需要做權(quán)限控制,一個系統(tǒng)只能查詢自己的數(shù)據(jù),這時候你又得在 C 端的消息發(fā)送系統(tǒng)里去做權(quán)限控制,整個系統(tǒng)就非常冗余了。
對于中臺來說,其思考的層次會更高一些。中臺將自己當(dāng)成是某塊通用業(yè)務(wù)的服務(wù)提供者,而不僅僅是一個內(nèi)部系統(tǒng)。對于核心的業(yè)務(wù)功能,其與微服務(wù)一樣通過接口提供功能。對于數(shù)據(jù)開放,其通過開放平臺開放數(shù)據(jù),并做權(quán)限控制。其實(shí)企業(yè)內(nèi)部的業(yè)務(wù)中臺,就很像淘寶開放平臺、京東開放平臺,只不過是開放的對象以及程度不同而已,因此我們完全可以按照開放平臺的思路去建設(shè)業(yè)務(wù)中臺。
中臺的平衡點(diǎn)
我們都說中臺是通用能力的復(fù)用,那么哪些是通用能力?哪些該做、哪些不該做?這或許是困擾我們中臺設(shè)計人員一個很痛苦的問題了。
要找到平衡點(diǎn),我的經(jīng)驗(yàn)是首先找到兩個極端點(diǎn)。 就拿我做過的消息中臺這個例子來說,左邊的極端點(diǎn)是極端定制化,即業(yè)務(wù)方要做什么,我們就做什么,冗余了大量的各種各樣的業(yè)務(wù)細(xì)節(jié)。右邊的極端點(diǎn)是極端地平庸化,平庸到提供的服務(wù)其實(shí)和第三方服務(wù)商提供的服務(wù)沒啥兩樣,那么業(yè)務(wù)方干脆直接對接第三方得了。
知道了兩個極端點(diǎn),我們也知道了一個范圍,我們后續(xù)要做的就是在兩個點(diǎn)中找到一個平衡點(diǎn)。 其實(shí)對于這個平衡點(diǎn)的選擇,更多的是依賴設(shè)計人員對于這塊業(yè)務(wù)的理解。業(yè)務(wù)人員需要深入地了解整個業(yè)務(wù)流程,了解哪些功能是所有調(diào)用方都重復(fù)做的,以此找出中臺要實(shí)現(xiàn)的通用功能。接著需要做的,就是將這些內(nèi)容封裝起來,設(shè)計一套業(yè)務(wù)邏輯和使用流程,讓調(diào)用方能簡單、方便地使用。
以我做過的消息中臺而言,我發(fā)現(xiàn)許多系統(tǒng)存在的重復(fù)功能是:多語言模板匹配和替換、多地區(qū)發(fā)送賬號匹配。多語言模板匹配和替換,指的是在國際化背景下,用戶都是各個國家的人,我們需要根據(jù)用戶的語言匹配對應(yīng)的模板。多地區(qū)發(fā)送賬號匹配,指的是在國際化背景下,用戶分布于各個國家地區(qū),每個國家地區(qū)的服務(wù)商都不同,因此需要匹配不同的賬號去發(fā)送。
找出消息中臺的重復(fù)功能之后,我們要做的是設(shè)計一套業(yè)務(wù)邏輯和使用流程。對于消息中臺,我們設(shè)計了:「系統(tǒng) - 業(yè)務(wù) - 模板組(賬號組)- 模板(賬號)」的核心業(yè)務(wù)邏輯。1 個調(diào)用方對應(yīng) 1 個系統(tǒng),1 個系統(tǒng)可以有多個業(yè)務(wù),1 個業(yè)務(wù)在某個渠道(郵件、短信等)只對應(yīng)一個賬號組,模板組(賬號組)則通過語言 + 站點(diǎn)(國家)去唯一確定一個模板(賬號)。
通過「系統(tǒng) - 業(yè)務(wù) - 模板組(賬號組)- 模板(賬號)」的業(yè)務(wù)邏輯設(shè)計,以及對應(yīng)的管理后臺配置流程,我們?yōu)橄⒅信_建立了一整套消息發(fā)送邏輯。調(diào)用方系統(tǒng)可以建立多個業(yè)務(wù),來關(guān)聯(lián)其真實(shí)的消息發(fā)送場景。每次需要發(fā)送某個消息發(fā)送場景,提前在管理后臺配置好對應(yīng)的模板組和賬號組。在發(fā)送的時候,只需要告訴消息中臺發(fā)送哪個業(yè)務(wù)、發(fā)給誰就可以了。
中臺的演變
當(dāng)我們設(shè)計好一個中臺之后,我們可能希望其實(shí)一成不變的。但事實(shí)上,中臺也是隨著業(yè)務(wù)的變化而變化的。就拿我做過的消息中臺來說,一開始其定位只是發(fā)送消息通知類,即注冊發(fā)送郵件、發(fā)貨通知等小批量的消息。但隨著業(yè)務(wù)的發(fā)展,有些系統(tǒng)需要在很短的時間內(nèi)發(fā)送幾百萬甚至幾千萬的消息。
這時候如果使用原有的系統(tǒng)功能,那么勢必導(dǎo)致消息擠壓,造成消息發(fā)送延遲。這時候作為中臺的設(shè)計者就需要根據(jù)自己對業(yè)務(wù)的理解,以及未來需要的可能性,去做一個架構(gòu)上的調(diào)整。如果判斷未來很可能有更多的系統(tǒng)需要這個功能,那么我們需要調(diào)整中臺的業(yè)務(wù)架構(gòu),去實(shí)現(xiàn)這個功能。對于短時間內(nèi)發(fā)送幾百萬消息的這種功能,我們后續(xù)是用了與之前完全不同的架構(gòu)去實(shí)現(xiàn)的,也設(shè)計了完全不同的數(shù)據(jù)結(jié)構(gòu)以及實(shí)現(xiàn)方法。但整體上,還是與原有功能融為一體,成為一個統(tǒng)一的消息中臺服務(wù)的。
前面說的是屬于業(yè)務(wù)發(fā)展中出現(xiàn)的新功能,但實(shí)際上也有可能是原有功能的不斷精細(xì)化。例如我們所說的通知類消息,它們可能有:發(fā)貨通知、注冊驗(yàn)證碼郵件、COD 貨到付款郵件等。隨著業(yè)務(wù)的發(fā)展,通知類消息越來越多,不同類型的消息的優(yōu)先級矛盾會越來越明顯。
對于 COD 貨到付款郵件來說,其涉及到用戶訂單付款,因此優(yōu)先級無疑是最高的。而注冊驗(yàn)證碼郵件,影響到用戶的注冊,相對來說也是優(yōu)先級較高的。而發(fā)貨通知,則只是一個通知的功能,優(yōu)先級相對優(yōu)先。在消息越來越多的情況下,消息中臺需要支持發(fā)送資源完全隔離的功能,以此來保障高優(yōu)先級業(yè)務(wù)的低延遲快速發(fā)送。
那么如何進(jìn)行業(yè)務(wù)架構(gòu)調(diào)整,既能滿足新功能的需要,又不影響原有的業(yè)務(wù)功能。這其實(shí)就極度考驗(yàn)中臺設(shè)計者對于業(yè)務(wù)的理解以及對于系統(tǒng)的理解了。
說到消息優(yōu)先級的問題,有些朋友會說:那我一開始設(shè)計的時候就考慮到優(yōu)先級問題,直接解決了不就好了么?
這個想法很好,但事實(shí)是很骨感的。很多時候我們不僅要考慮技術(shù)實(shí)現(xiàn),還要考慮業(yè)務(wù)當(dāng)前的情況。如果業(yè)務(wù)當(dāng)前并沒有多少消息發(fā)送流量,所有消息基本上都能很快發(fā)送出去,這時消息中臺來實(shí)現(xiàn)優(yōu)先級的功能,有什么意義呢?不僅增加研發(fā)成本不說,還讓系統(tǒng)更加復(fù)雜,增加了維護(hù)成本。
業(yè)務(wù)這個因素,其實(shí)是很多技術(shù)人員忽略的一個問題。我們做設(shè)計以及實(shí)現(xiàn)的時候,不僅要考慮技術(shù)擴(kuò)展性,還要考慮業(yè)務(wù)目前的發(fā)展情況、團(tuán)隊(duì)成員的能力情況,才能做出適合當(dāng)下情況的最優(yōu)選擇。 而不是簡單地拍腦袋做一個大而全的東西,用大炮打蚊子,浪費(fèi)資源。其實(shí)對于是否要在項(xiàng)目中使用設(shè)計模式,也是類似的思考方式,重點(diǎn)還是得看團(tuán)隊(duì)成員的專業(yè)能力。
總結(jié)
什么是中臺?我認(rèn)為中臺是對重復(fù)業(yè)務(wù)功能的產(chǎn)品級別封裝,有別于微服務(wù)的系統(tǒng)級簡單封裝。產(chǎn)品級別的封裝需要深入了解業(yè)務(wù),定制出一套自己的業(yè)務(wù)概念,屏蔽底層的細(xì)節(jié)。此外,數(shù)據(jù)開放也是中臺本身有別于微服務(wù)的一個關(guān)鍵點(diǎn)。
如何找到中臺的平衡點(diǎn)?對于平衡點(diǎn),我提出了一個方法論:確定區(qū)間范圍,即知道最好、最差的情況下是什么,然后找到合理的中間態(tài)。這個中間態(tài)取決于中臺的定位,如果你的定位是公司級的中臺,那么你解決的就應(yīng)該是公司級別的通用功能。
如何看待中臺的演進(jìn)?中臺是隨著業(yè)務(wù)發(fā)展的,中臺設(shè)計者需要緊跟業(yè)務(wù)需求,從需求中洞見未來的趨勢,找到中臺的方向。此外,設(shè)計之時不僅應(yīng)該考慮技術(shù)問題,也應(yīng)該考慮當(dāng)時業(yè)務(wù)規(guī)模、團(tuán)隊(duì)協(xié)作、人員能力問題,做出綜合成本最低的設(shè)計方案,而不是用大炮打蚊子。
那么做中臺需要哪些能力呢?
其實(shí)從上面我的一些思考不難看出:需要有高度抽象思考的能力。 這可以說是最最重要的能力,沒有這種能力,你很難找出共同的功能點(diǎn),也就很難找到中臺的定位。另一個能力是綜合權(quán)衡,做出最優(yōu)選擇的能力。 在中臺的演進(jìn)中我們說到要考慮業(yè)務(wù)規(guī)模、團(tuán)隊(duì)協(xié)作等情況,這就需要中臺設(shè)計者去綜合各種因素,做出最優(yōu)選擇,而不是單單追求技術(shù)的高大上。