新用戶登錄后自動(dòng)創(chuàng)建賬號(hào)
登錄我之前編譯的一篇文章《公司拆成自主管理的小團(tuán)隊(duì),馬云專程去北歐學(xué)來的管理結(jié)構(gòu)》,說的就是北歐公司Hudl如何模仿Spotify“自主運(yùn)營小組”的管理模式。具體這篇文章是Spotify官方博客里的內(nèi)容,相比Hudl所說的,算是第一手的經(jīng)驗(yàn)。
Spotify是北歐的技術(shù)公司,一直熱衷于在內(nèi)部建立大量的“自主運(yùn)營小組”(squad),由小組自我完成工作,而不需要自上而下的管理。這很類似于凱文凱利在《失控》中的觀點(diǎn),在企業(yè)內(nèi)部組織運(yùn)行中的實(shí)現(xiàn)。
今天的文章,說的是Spotify一方面在企業(yè)組織形式上建立“自主運(yùn)營小組”,一方面又在技術(shù)后臺(tái)的系統(tǒng)架構(gòu)上,為適應(yīng)這種企業(yè)組織形式,而進(jìn)行了相應(yīng)的調(diào)整。
從文章隱含的意思來看,Spotify一直認(rèn)為,公司內(nèi)部運(yùn)行效率低下的重要原因是:各個(gè)團(tuán)隊(duì)之間需要互相協(xié)作,一旦某個(gè)團(tuán)隊(duì)工作進(jìn)度慢了,其他所有團(tuán)隊(duì)都要等著,于是造成工期延誤。所以,要提高公司的整體效率,就要讓各個(gè)工作團(tuán)隊(duì)之間,互相不依賴;任何一個(gè)團(tuán)隊(duì)的工作不影響另外一個(gè)團(tuán)隊(duì)。
為了實(shí)現(xiàn)這樣的效果,公司產(chǎn)品層面應(yīng)該把各個(gè)功能模塊都隔絕開,某個(gè)功能出現(xiàn)問題,不影響其他功能的正常使用,也就是說,開發(fā)這個(gè)功能的小組掉鏈子了,其他小組開發(fā)的功能還仍然照舊運(yùn)行。
為了實(shí)現(xiàn)這樣的效果,公司的系統(tǒng)架構(gòu)上也要調(diào)整。數(shù)據(jù)庫、存儲(chǔ)等技術(shù)性資源支持方面的工作,也不需要公司內(nèi)部來組織某個(gè)職能部門來協(xié)調(diào),否則職能部門的工作效率將會(huì)影響到資源的調(diào)配效率。所以Spotify建立來一個(gè)類似云服務(wù)的平臺(tái),讓小組自己去配置。
這篇文章有一些細(xì)節(jié)內(nèi)容偏技術(shù),所以我翻譯不出來,錯(cuò)誤肯定會(huì)不少。大家如果側(cè)重技術(shù),還是去看原文吧。原諒我,我本專業(yè)只是個(gè)律師。
為什么明明讀不懂技術(shù)名詞,還要硬著頭皮看這篇文章呢?
因?yàn)椋词故钦f了很多偏技術(shù)的東西,但是基本的思路我還是非常理解和認(rèn)同。或者說,這種技術(shù)后臺(tái)的系統(tǒng)架構(gòu),其實(shí)就是一種企業(yè)生產(chǎn)流程。即使是非技術(shù)型的企業(yè),也可以建立一種這樣的企業(yè)運(yùn)營體制,在這個(gè)體制之上建立各個(gè)接口,讓各個(gè)獨(dú)立的工作小組,可以接入這體制、進(jìn)行運(yùn)轉(zhuǎn),而不受其他環(huán)節(jié)的束縛。
這是我想將來嘗試的企業(yè)組織和管理結(jié)構(gòu)。
其實(shí),經(jīng)濟(jì)學(xué)家科斯說過類似的觀點(diǎn)。為什么企業(yè)會(huì)產(chǎn)生?企業(yè)的各個(gè)部門,之前本來都是獨(dú)立的,大家通過市場上的自由合作來實(shí)現(xiàn)協(xié)作。如果什么時(shí)候覺得自由合作效率不高,那大家就合并起來,組成一個(gè)企業(yè),由企業(yè)進(jìn)行自上而下的計(jì)劃經(jīng)濟(jì)模式的指揮管理。現(xiàn)在,Spotify這種模式的出現(xiàn),實(shí)際上把企業(yè)產(chǎn)生之前的市場自由合作,又搬回來企業(yè)內(nèi)部,在企業(yè)內(nèi)部建立一個(gè)自由協(xié)作的市場機(jī)制。
我想,原因可能是,在科斯時(shí)代及之前,信息在市場上的傳導(dǎo)速度太慢,導(dǎo)致自由合作的效率低,而合并為一個(gè)企業(yè)后,在企業(yè)內(nèi)部組織生產(chǎn),信息傳導(dǎo)的速度就起來了。但是現(xiàn)在,有來IT信息技術(shù),即使是在企業(yè)外部,信息也可以迅速傳導(dǎo),那么就不需要企業(yè)來組織生產(chǎn)來,通過一個(gè)信息架構(gòu)平臺(tái),就可以實(shí)現(xiàn)企業(yè)本身的信息傳遞、生產(chǎn)組織等職能。
比如,Uber、滴滴打車、Airbnb、餓了么,實(shí)際上都是在用技術(shù)平臺(tái),扮演之前“企業(yè)”的角色。司機(jī)不再需要從屬于出租車公司來調(diào)度,滴滴打車的技術(shù)平臺(tái)就是出租車調(diào)度公司。
信息技術(shù),正在取代企業(yè)組織形式。
在這篇文章里我要大致介紹一下Spotify的后臺(tái)架構(gòu)。我們的后臺(tái)架構(gòu)一種處在不斷改進(jìn)的過程中,有的模塊已經(jīng)用了很久了,有多么模塊才剛剛開始開發(fā)出來。
要理解為什么Spotify要建立這樣的后臺(tái)架構(gòu),最好先了解一下Spotify的團(tuán)隊(duì)組織結(jié)構(gòu)和協(xié)作模式。Spotify目前有300名工程師,而且還在快速增加中。
一、背景
1. 增長:
Spotify的所有指標(biāo)都在不停地增長,而且規(guī)模越來越龐大。比如,日常用戶的數(shù)量、后端節(jié)點(diǎn)的數(shù)量、客戶端所運(yùn)行的硬件平臺(tái)數(shù)量,產(chǎn)品開發(fā)團(tuán)隊(duì)的數(shù)量,在Spotify平臺(tái)上運(yùn)行的外部應(yīng)用程序的數(shù)量,Spotify上歌曲的數(shù)量,都在一股腦迅速增長。
2.速度:
正是因?yàn)镾potify的增長速度太快,我們不得不一遍又一遍地仔細(xì)分析,在Spotify有什么東西會(huì)妨礙這樣的發(fā)展速度,并且不斷地消除這樣的因素。所以,我們付出了不少努力,一方面,盡可能降低內(nèi)部各個(gè)團(tuán)隊(duì)之間的互相依賴關(guān)系;另一方面,如果我們的架構(gòu)中存在某些會(huì)讓工作復(fù)雜化的東西,而這些東西又是可有可無的話,我們就會(huì)干凈利落地淘汰掉這些毫無意義的復(fù)雜玩意。
在Spotify我們建立了很多自行運(yùn)營的小組(squad)。Spotify內(nèi)部,最重要的一個(gè)觀念就是,團(tuán)隊(duì)必須能自行運(yùn)營。每個(gè)開發(fā)團(tuán)隊(duì)(或者說“小組”),其工作和運(yùn)營,都應(yīng)當(dāng)是能獨(dú)立于其他小組的。
即使有時(shí)候兩個(gè)小組之間存在一定的互相依賴關(guān)系,但大部分時(shí)候各個(gè)小組之間還應(yīng)當(dāng)是獨(dú)立前進(jìn)的。如果某個(gè)小組的工作能否取得進(jìn)展,依賴于另一個(gè)小組的工作進(jìn)展,那么我們會(huì)采取這樣的策略:在內(nèi)部各個(gè)團(tuán)隊(duì)之間實(shí)行代碼透明化的模式( transparent code model),并建立自助服務(wù)架構(gòu)( self service infrastructure)。
3. 代碼透明化模式:
Spotify內(nèi)部的每個(gè)開發(fā)團(tuán)隊(duì)都可以看到Spotify的所有代碼。這意味著,Spotify的所有開發(fā)人員,都可以看到Spotify客戶端、Spotify后臺(tái)和Spotify架構(gòu)的所有代碼,并且也可以修改這些代碼。如果某個(gè)小組遲遲不能完成工作,導(dǎo)致另外一個(gè)小組沒有辦法開展下一步工作,那么后面這個(gè)小組完全可以跳開前面那個(gè)小組,自己去完全前面小組應(yīng)該完成的工作、直接更新所需要的代碼。
在實(shí)踐中,Spotify的代碼透明模式,是通過所有團(tuán)隊(duì)共享同一臺(tái)git服務(wù)器(git server)來實(shí)現(xiàn)的。每個(gè)git存儲(chǔ)器( git repo)都會(huì)指定一名系統(tǒng)所有者,負(fù)責(zé)維護(hù)代碼,確保代碼不會(huì)rot。代碼透明模式讓每個(gè)人的工作都可以向前推進(jìn),每個(gè)人都可以獲得其他所有人的代碼。這種方式讓Spotify可以隨時(shí)向前推進(jìn),并保持一種積極和開放工作環(huán)境。
4. 自助服務(wù)架構(gòu):
所有的架構(gòu)都應(yīng)當(dāng)是可以自助服務(wù)的( self service entity)。通過這種方式,任何一個(gè)團(tuán)隊(duì)要向前推進(jìn)工作,都想不需要等另外一個(gè)團(tuán)隊(duì)幫他們獲得硬件支持、設(shè)置存儲(chǔ)集群( storage cluster)或更改配置( configuration change)。Spotify的后端架構(gòu)建立來好幾個(gè)層次的硬件和軟件,從物理設(shè)備( physical machines )到信息傳輸( messaging)與存儲(chǔ)解決方案(storage solutions)。
5. 開源:
我們一直在盡可能用開源的工具。在Spotify 的后端所使用的軟件中,我們會(huì)選擇對(duì)Spotify最關(guān)鍵的一些軟件,努力提高其可伸縮性。Spotify 也在積極參與為許多開源項(xiàng)目,比如Apache Cassandra和ZMQ。我們幾乎沒有自己的專用軟件,因?yàn)槲覀儾徽J(rèn)為我們有能力開發(fā)出能適應(yīng)Spotify飛速發(fā)展需求的軟件。
6. 文化:
在Spotify我們堅(jiān)信應(yīng)當(dāng)給個(gè)人充分的授權(quán)。這反映在我們的企業(yè)組織結(jié)構(gòu)中建立了自主運(yùn)營團(tuán)隊(duì)。這樣工程師就有足夠機(jī)會(huì)在Spotify內(nèi)部參與和嘗試其他領(lǐng)域的工作,從而讓每個(gè)人對(duì)工作都能保持熱情。我們還會(huì)定期組織駭客日(hackday),讓每個(gè)人嘗試實(shí)現(xiàn)他們的任何想法。
二、基本架構(gòu)
只要是需要處理大量用戶的系統(tǒng)架構(gòu),Spotify都會(huì)進(jìn)行分區(qū)。Spotify架構(gòu)有多種分區(qū)的方式。最主要的是通過功能進(jìn)行分區(qū)。我們可以先采用非常非常簡化的方式來描述這種分區(qū)。
比如,Spotify客戶端中所有頁面中涉及物理屏幕的部分,由某個(gè)小組負(fù)責(zé),Spotify中所有的功能性部分由另一個(gè)小組負(fù)責(zé)。每個(gè)小組負(fù)責(zé)的功能都是跨平臺(tái)的,比如,既包括在IOS設(shè)備上、也包括在瀏覽器上通過Spotify的后端即時(shí)響應(yīng)請(qǐng)求。(翻譯不出來了,不太懂技術(shù)啊)
即使某個(gè)功能沒能實(shí)現(xiàn)出來,Spotify客戶端上的其他功能仍然不受影響,并會(huì)獨(dú)立地繼續(xù)工作。如果兩個(gè)功能之間確實(shí)存在某種些微的依賴關(guān)系,有時(shí)候一個(gè)功能沒有實(shí)現(xiàn),只會(huì)導(dǎo)致另一個(gè)功能不能完全發(fā)揮出來,但不會(huì)導(dǎo)致整個(gè)Spotify無法提供服務(wù)。
由于并不是每個(gè)用戶都會(huì)用到Spotify的所有功能,某些功能出現(xiàn)問題只會(huì)涉及到很小一部分用戶。
并且,因?yàn)槟硞€(gè)功能所涉及的技術(shù),都由某一個(gè)小組集中掌握的,所以很容易在這個(gè)小組內(nèi)部進(jìn)行A/B測試,也很容易對(duì)收集到到數(shù)據(jù)進(jìn)行分析,并由直接涉及的小組來負(fù)責(zé)考慮如何對(duì)這個(gè)功能進(jìn)行決策。
功能分區(qū)工作更具有可伸縮性、更可靠、也更高效,從而使團(tuán)隊(duì)的工作更專注。
三、后端架構(gòu)
Spotify先是把產(chǎn)品架構(gòu)按功能進(jìn)行分區(qū),并建立了技術(shù)水平高超的跨功能小組來進(jìn)行工作任務(wù)的維護(hù)。在解決這些問題之后,Spotify面臨的問題是:Spotify的后端架構(gòu)能否確保各個(gè)小組獨(dú)立自主運(yùn)營。
讓每個(gè)小組都可以快速地開發(fā)出產(chǎn)品功能,而不會(huì)受到其他小組的拖累,這是我們的架構(gòu)所需要解決的問題。而Spotify的解決方案,還應(yīng)當(dāng)可以擴(kuò)展到全球。我已經(jīng)說過,我們建立了代碼透明模式來解決這個(gè)問題,讓某個(gè)團(tuán)隊(duì)可以直接跳過其他配合團(tuán)隊(duì)的工作,直接向前推進(jìn)。但是,除了眾多的功能開發(fā)小組之外,Spotify還有其他團(tuán)隊(duì)需要以合適的方式組織起來。
在許多企業(yè)的組織體系里,都會(huì)有一個(gè)數(shù)據(jù)庫管理員,負(fù)責(zé)數(shù)據(jù)庫及其架構(gòu)的維護(hù)。你需要通過運(yùn)營部門區(qū)申請(qǐng)從數(shù)據(jù)中心分配硬件,或者諸如此類的工作。
如果自主運(yùn)營的產(chǎn)品開發(fā)小組有100個(gè)以上時(shí),這種組織工作就會(huì)成為小組開發(fā)工作的瓶頸,因?yàn)檫\(yùn)營部門實(shí)在無法應(yīng)付眾多的小組同時(shí)提出需求。
為了解決這個(gè)問題,我們開發(fā)出了一個(gè)后端的架構(gòu),提供完全自助化的服務(wù),不再需要運(yùn)營部門來做這樣的配合工作。完全自助服務(wù)意味著,任何小組都可以在現(xiàn)場自行進(jìn)行開發(fā)和迭代,而不需要其他團(tuán)隊(duì)或部門的配合。
1. 配置:
如果某個(gè)小組開發(fā)新的功能,往往需要在多個(gè)地方同時(shí)部署。我們正在開發(fā)的一個(gè)后端架構(gòu),運(yùn)行開發(fā)小組自行決定是在Spotify的數(shù)據(jù)中心部署,還是在外部的公有云部署。Spotify的系統(tǒng)架構(gòu),正在盡可能讓Spotify內(nèi)部的數(shù)據(jù)中心和外部的公有云之間不存在太大的差別,這樣方便開發(fā)小組選擇和使用。簡而言之,Spotify內(nèi)部的數(shù)據(jù)中心遲延問題處理的最好,也最穩(wěn)定。外部公有云硬件條件更好更快,而且動(dòng)態(tài)擴(kuò)展性更好。開發(fā)小組可以根據(jù)自己的需要靈活選擇。
2. 存儲(chǔ):
大多數(shù)功能都需要某種形式的存儲(chǔ),比如“播放列表”功能或者“關(guān)注”功能。對(duì)于一個(gè)有數(shù)百萬人使用的功能來說,建立一個(gè)合適的存儲(chǔ)解決方案并不是一件容易的事情,有很多因素都需要考慮到:訪問模式、站點(diǎn)之間的故障轉(zhuǎn)移、工作容量、一致性、備份、降級(jí)等。很難找到一個(gè)通用的方法完全解決所有的問題。所以,Spotify的后端架構(gòu)中提供了不同的存儲(chǔ)方案:Cassandra, PostgreSQL 和 memcached。
3. 信息傳輸:
Spotify的客戶端和后端服務(wù)之間的信息溝通,通過這種模式來實(shí)現(xiàn):請(qǐng)求-應(yīng)答( request-reply),信息傳輸( messaging),發(fā)布訂閱(pubsub)。我們自己建立一套低遲延、低額外開銷(overhead)的信息傳輸層,并準(zhǔn)備將其擴(kuò)展到高投遞保障( delivery guarantees)、故障轉(zhuǎn)移路由( failover routing)和更靈活的負(fù)載平衡(load-balancing)。
4. 容量規(guī)劃:
Spotify的快速增長使Spotify的后端發(fā)生了大量的流量。每個(gè)小組都需要確保他們的功能可以擴(kuò)展到本地負(fù)載。各個(gè)小組可以手動(dòng)監(jiān)控其流量,發(fā)現(xiàn)和解決遇到的瓶頸,并根據(jù)需要擴(kuò)容。我們也建立了一個(gè)后端架構(gòu),讓各個(gè)小組都可以自動(dòng)擴(kuò)展其服務(wù)的負(fù)載。因?yàn)橹挥性谀阋呀?jīng)發(fā)現(xiàn)遇到瓶頸了才會(huì)擴(kuò)展自動(dòng)負(fù)載,所以需要開發(fā)小組自己進(jìn)行一定程度的人工監(jiān)控。我們的后端架構(gòu)可以很容易的創(chuàng)建出負(fù)載情況的圖標(biāo),并在需要時(shí)發(fā)出警報(bào)。
5. 功能或服務(wù)互相隔離:
小組開發(fā)出來的新功能或服務(wù)之間應(yīng)當(dāng)與現(xiàn)有的功能保持一定的隔離。這非常重要,因?yàn)檫@樣就能讓開發(fā)小組毫無顧忌地以最快的速度開發(fā)產(chǎn)品,同時(shí)把負(fù)面影響控制在最小。為了實(shí)現(xiàn)這樣的需求,我們對(duì)信息傳輸層的速率做了限制,并且通過許可機(jī)制進(jìn)行控制。速度限制有一個(gè)默認(rèn)的閾值,從而運(yùn)行開發(fā)小組可以在一定范圍之內(nèi)調(diào)用其他服務(wù)。如果預(yù)計(jì)到可能發(fā)生流量擁堵,開發(fā)小組之間需要進(jìn)行協(xié)調(diào),以共同處理這個(gè)問題。不同小組開發(fā)的不同功能,分別獨(dú)立地在不同的服務(wù)器或虛擬主機(jī)上運(yùn)行,以避免某個(gè)服務(wù)影響到另外一個(gè)服務(wù)。
四、總結(jié)
正如我一開始所說的,我們的這種架構(gòu)還處于完善過程中,還會(huì)遇到很多有意思的挑戰(zhàn)。我所說的,只是我們目前的觀點(diǎn)。因?yàn)槲覀円恢痹诓粩喔倪M(jìn),所以我的觀點(diǎn)也會(huì)不斷修正和改變。
原文標(biāo)題:Backend infrastructure at Spotify
原文鏈接:https://labs.spotify.com/2013/03/15/backend-infrastructure-at-spotify
找回密碼
注冊賬號(hào)