探索原味 BFF 模式

BFF — Backends For Frontends 前计。在后來的學(xué)習(xí)和工作經(jīng)驗(yàn)累積中逐步的加深了對(duì) BFF 的理解,這個(gè)模式它具有更加確切的一些使用場(chǎng)景以及解決的是一些更加特定的問題。本篇小作文中肉迫,從找到 BFF 的起源開始弄跌,回到 BFF 模式誕生的大背景下,去探索那個(gè)特殊環(huán)境下遇到了什么樣的問題催生出了這個(gè)在微服務(wù)系統(tǒng)中出鏡率極高的模式虏两。

尋找源頭

首先愧旦,從技術(shù)雷達(dá)(https://www.thoughtworks.com/radar/techniques/bff-backend-for-frontends)中 BFF 的條目上,可以找到一些蛛絲馬跡定罢。條目的發(fā)布時(shí)間是 2015 年 11 月10 日笤虫。接著,我們?cè)诠雀杷阉麝P(guān)鍵字Backend for Frontend 以及將時(shí)間范圍限定在 2015 年 1 月 1 日到 2015 年 11 月 10 日祖凫。

接下來琼蚯,對(duì)比搜索結(jié)果的時(shí)間,我找到最早出現(xiàn) Backend for Frontend 詞條的文章(https://philcalcado.com/2015/09/18/the_back_end_for_front_end_pattern_bff.html)蝙场。

文中提到凌停,BFF 這個(gè)名字是被當(dāng)時(shí)團(tuán)隊(duì) TechLeader Nick Fisher(https://twitter.com/spadgos)提出的,并最后在團(tuán)隊(duì)投票后被采納售滤。為了萬(wàn)無(wú)一失罚拟,找到其他的交叉證據(jù),我才能更加確定這個(gè)結(jié)果完箩。非常幸運(yùn)的是赐俗,在洞見文章(https://www.thoughtworks.com/insights/blog/bff-soundcloud)也提到了相同的結(jié)論。由此弊知,我們可以說 BFF 模式是在 SoundCloud(https://zh.wikipedia.org/zh-hans/SoundCloud) 首次出現(xiàn)阻逮。接著,讓我們一起回到BFF 第一次發(fā)揮威力的現(xiàn)場(chǎng)吧秩彤。

問題初現(xiàn)

為了更有條理的了解當(dāng)年SoundCloud 遇到了什么樣的挑戰(zhàn)叔扼,我通過分類分項(xiàng)的方式來列舉情況和分析。

  • 背景:

    • SoundCloud(https://blog.sellfy.com/make-more-money-on-soundcloud/
      主要是通過付費(fèi)訂閱與廣告進(jìn)行盈利(也就是說漫雷,越多的曝光渠道瓜富,會(huì)給SoundCloud 帶來更多的盈利機(jī)會(huì))

    • SoundCloud 是一個(gè)單體系統(tǒng),通過暴露共享 API 的方式為 Web 客戶端降盹、Android 和 iOS 應(yīng)用程序以及互聯(lián)網(wǎng)与柑、合作伙伴等提供服務(wù)。這些共享 API 隨著功能和特性一起增長(zhǎng),最終變成了平臺(tái)與客戶端之間的集成點(diǎn)价捧。

    • 將 2007 年開始運(yùn)行的 SoundCloud 從單體模式轉(zhuǎn)變至微服務(wù)模式 (具體改造過程:https://philcalcado.com/2015/09/08/how_we_ended_up_with_microservices.html)丑念。
      此時(shí),單體服務(wù)已經(jīng)被拆分為多個(gè)微服務(wù)结蟋。

    • 支持在 IOS 平臺(tái)上新增的應(yīng)用程序(原來的產(chǎn)品主要是在 Web 端提供服務(wù))


      Public.png
  • 主要?jiǎng)訖C(jī):
    • 減少產(chǎn)品發(fā)布上線的時(shí)間
    • 支持 IOS 平臺(tái)的新應(yīng)用程序脯倚,隔離其不同用戶體驗(yàn)和交互模式帶來的風(fēng)險(xiǎn)
  • 挑戰(zhàn):

    • 為了讓第三方開發(fā)人員能更自由的集成,需要設(shè)計(jì)出不對(duì)數(shù)據(jù)的使用方式做出任何假設(shè)的 API椎眯。 所以挠将,即便是呈現(xiàn)很簡(jiǎn)單的體驗(yàn),也需要許多的 HTTP API 來提供服務(wù)编整。導(dǎo)致了構(gòu)建一個(gè)簡(jiǎn)單的頁(yè)面的數(shù)據(jù)需要上百個(gè) API 請(qǐng)求來獲取舔稀。

    • 每次團(tuán)隊(duì)需要更改現(xiàn)有API 時(shí),都需要確保更改不會(huì)破壞我們現(xiàn)有的任何客戶端(包括重要的第三方集成)掌测。每當(dāng)添加新內(nèi)容内贮,都必須投入大量時(shí)間來確保新功能不會(huì)過度用于特定客戶端,以便所有客戶都可以輕松使用新功能汞斧。 所有這些協(xié)調(diào)使日常工作變得比應(yīng)有的困難得多夜郁,也就導(dǎo)致了新功能發(fā)布緩慢。

    • 開始準(zhǔn)備開發(fā)新 iOS 應(yīng)用程序粘勒, 新平臺(tái)上的應(yīng)用程序的用戶體驗(yàn)會(huì)全部被重塑

    通過分析上面的各種情況竞端,可以得出當(dāng)時(shí)SoundCloud 后端團(tuán)隊(duì)面對(duì)的如下幾個(gè)問題:

  • 問題一:難以為每個(gè)第三方客戶提供合適粒度的 API,導(dǎo)致了 API 數(shù)據(jù)粒度過細(xì)庙睡,想完成一個(gè)業(yè)務(wù)服務(wù)需要請(qǐng)求的 API 太多事富。

  • 問題二:現(xiàn)有的對(duì)外 API 與消費(fèi)方耦合嚴(yán)重,維護(hù)成本高乘陪,時(shí)間長(zhǎng)统台,新功能發(fā)布緩慢。

  • 問題三:IOS平臺(tái)新客戶端更進(jìn)了用戶體驗(yàn)和交互方式啡邑,需要隔離新App帶來的風(fēng)險(xiǎn)贱勃,并且還要找到與多個(gè)客戶端團(tuán)隊(duì)更好的合作方式。

    看上去谤逼,這三個(gè)問題在通常后端團(tuán)隊(duì)在完成微服務(wù)改造中往往也會(huì)遇到贵扰。讓我們一起看看,他們是如何一步步見招拆招解決問題流部,并且找到《BFF》這個(gè)內(nèi)功心法的戚绕。

Backends For Frontends 初成

SoundCloud 后端團(tuán)隊(duì)在面對(duì)上面復(fù)雜的問題時(shí)顯得非常的專業(yè)。他們一開始便決定了贵涵,通過對(duì)不同客戶端提供不同的 API 來各個(gè)擊破列肢。避免重蹈覆轍,多個(gè)客戶端依賴同一套 API宾茂,繼而耦合需求重合瓷马,無(wú)法進(jìn)行靈活變更。同時(shí)跨晴,后端 Tech Lead Nick Fisher 創(chuàng)造了 BFF 這個(gè)縮寫欧聘,也在團(tuán)隊(duì)內(nèi)通過投票被認(rèn)可。BFF 終于出現(xiàn)在技術(shù)世界的舞臺(tái)之上端盆,當(dāng)時(shí)的架構(gòu)如下圖所示怀骤。


ServceB.png

你會(huì)發(fā)現(xiàn)與現(xiàn)在使用 BFF 模式的架構(gòu)圖有些細(xì)微的差別。沒錯(cuò)焕妙,現(xiàn)在 BFF 還沒真正的進(jìn)化到成熟模式蒋伦。接下來讓我們看看它是在什么契機(jī)之下發(fā)生了進(jìn)化。

后續(xù)的的研發(fā)中客戶端團(tuán)隊(duì)意識(shí)到焚鹊。由于他們擁有 API痕届, 他們可以提取對(duì)不同服務(wù)進(jìn)行多次調(diào)用的所有邏輯,并將它們混合到后端的用戶配置文件中末患。這將簡(jiǎn)化代碼并提高性能研叫。不是對(duì)后端服務(wù)多次不同的調(diào)用,而是客戶端對(duì)單個(gè)資源簡(jiǎn)單請(qǐng)求璧针,例如:

  • GET /user-profile/123.json

    當(dāng)后端團(tuán)隊(duì)進(jìn)一步試驗(yàn)這個(gè)方式時(shí)嚷炉,他們發(fā)現(xiàn)了自己在 BFF 中編寫了很多 Presentation Model。 在這個(gè)時(shí)候探橱,他們突然意識(shí)到 BFF 不只是被客戶端使用的 API 申屹,而是 BFF 本身就是申請(qǐng)的一部分。BFF 新的形態(tài)出現(xiàn)了走搁,具體如下圖所示:

Moosle.png

滴答滴答独柑,時(shí)鐘在前進(jìn),SoundCloud 的 BFF 也在持續(xù)增加私植。這時(shí)忌栅,他們已經(jīng)在生產(chǎn)環(huán)境同時(shí)維護(hù)著 5 個(gè) BFF 了。為了進(jìn)一步提高生產(chǎn)力曲稼,減少不必要的重復(fù)索绪。 User Profile 從每個(gè)不同的微服務(wù)中抽取出來,變成一個(gè)獨(dú)立的在 service 與 BFF 之間的應(yīng)用服務(wù)贫悄。隨著時(shí)間的推移瑞驱,他們發(fā)現(xiàn)了越來越多這樣的情況。現(xiàn)在 SoundCloud 的 BFF 顯然隨著時(shí)間的推移而增長(zhǎng)窄坦,這種橫向增長(zhǎng)再不會(huì)引起任何問題了唤反。最終凳寺,BFF 模式的架構(gòu)變成下圖:

Serviee A.png

結(jié)論

BFF 模式為我們?cè)谑褂梦⒎?wù)時(shí),針對(duì)多客戶端開發(fā)的問題彤侍,提供了一種很好的方法肠缨。使我們?cè)跇?gòu)建面向客戶端的后端團(tuán)隊(duì)能夠掌控自己的命運(yùn)。 這種自主性對(duì)于快速迭代客戶端應(yīng)用程序并快速提供良好的體驗(yàn)至關(guān)重要盏阶。 通過支持持續(xù)的演進(jìn)和變化晒奕,通過這種模式可以將消費(fèi)者的行為限制在一個(gè)可控范圍,會(huì)使他們變的更容易合作和改變名斟。并且脑慧,更好滿足不同客戶端不同的特性需求。如果砰盐,在系統(tǒng)建立一開始便希望所有東西都是可復(fù)用的闷袒,會(huì)給系統(tǒng)的維護(hù)和協(xié)調(diào)帶來巨大的挑戰(zhàn)。特別是在面對(duì)需要維護(hù)多個(gè)客戶端或消費(fèi)者的場(chǎng)景下岩梳。在考慮通用用法之前霜运,請(qǐng)專注于您的功能和特定用例。再在了解情況的基礎(chǔ)上逐步進(jìn)行低成本和合理的通用和復(fù)用蒋腮。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末淘捡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子池摧,更是在濱河造成了極大的恐慌焦除,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件作彤,死亡現(xiàn)場(chǎng)離奇詭異膘魄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)竭讳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門创葡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绢慢,你說我怎么就攤上這事灿渴。” “怎么了胰舆?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵骚露,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我缚窿,道長(zhǎng)棘幸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任倦零,我火速辦了婚禮误续,結(jié)果婚禮上吨悍,老公的妹妹穿的比我還像新娘。我一直安慰自己蹋嵌,他們只是感情好畜份,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著欣尼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪停蕉。 梳的紋絲不亂的頭發(fā)上愕鼓,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音慧起,去河邊找鬼菇晃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蚓挤,可吹牛的內(nèi)容都是我干的磺送。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼灿意,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼估灿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缤剧,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤馅袁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后荒辕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汗销,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年抵窒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弛针。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡李皇,死狀恐怖削茁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掉房,我是刑警寧澤付材,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站圃阳,受9級(jí)特大地震影響厌衔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捍岳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一富寿、第九天 我趴在偏房一處隱蔽的房頂上張望睬隶。 院中可真熱鬧,春花似錦页徐、人聲如沸苏潜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)恤左。三九已至,卻和暖如春搀绣,著一層夾襖步出監(jiān)牢的瞬間飞袋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工链患, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留巧鸭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓麻捻,卻偏偏與公主長(zhǎng)得像纲仍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贸毕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容