不要將自己鎖定在自己的架構(gòu)中
早在2006年,事務(wù)處理的開山鼻祖,數(shù)據(jù)庫領(lǐng)域圖領(lǐng)獎得主Jim Gray與Werner Vogels 進行了“第一次”對話。對話的主題是“向亞馬遜技術(shù)平臺學習”,而吊詭之處在于,Jim Gray所開創(chuàng)的事務(wù)處理是亞馬遜電子商務(wù)的技術(shù)基礎(chǔ)。
最近,Akamai董事Tom Killalea與亞馬遜CTO Werner Vogels 進行了一場“第二次”對話。對話的主題是大規(guī)模簡單存儲系統(tǒng)S3的進化設(shè)計。而吊詭之處在于,而就在一個月前,一個可以對標S3的最大區(qū)塊鏈存儲項目Filecoin剛剛升空。
“我認為重要的是要首先意識到亞馬遜是一家技術(shù)公司”,在“第一次”對話中,Werner Vogels 反復(fù)對Jim Gray解釋稱,亞馬遜不應(yīng)該僅僅被視為一家在線書店,而應(yīng)該被視為一家科技公司。并且,就是在這次談話中,亞馬遜首次公開了S3,一個簡單存儲服務(wù)。
“Amazon.Com Books”,這個名字并不能反映我們的雄心壯志。Tom Killalea說到。當Tom Killalea在1998年加入亞馬遜時(Tom Killalea于2018年3月加入Akamai,擔任董事),該公司只是一個銷售書籍的網(wǎng)站:一個簡單C應(yīng)用Obidos,一個部署在Berkeley DBs上的鍵值存儲,一個命名為“ACB”的關(guān)系數(shù)據(jù)庫(代指“Amazon.Com Books”),這些應(yīng)用部署在5臺服務(wù)器上。
不斷擴大的客戶和訂單,讓亞馬遜放棄了單體架構(gòu),走向去中心化的服務(wù)化架構(gòu)。當Jim Gray問及亞馬遜最大的經(jīng)驗教訓時,Werner Vogels 說道:
- 第一個教訓,也是最重要的教訓,更是元教訓:服務(wù)意識。嚴格的面向服務(wù)是實現(xiàn)隔離的優(yōu)秀技術(shù),你會達到一個前所未見的擁有和控制的水平。通過使用服務(wù),不僅技術(shù)方面得到了改進,開發(fā)和業(yè)務(wù)進程也大大受益于它。服務(wù)模型是創(chuàng)建以客戶為中心的快速創(chuàng)新團隊的關(guān)鍵推動。每個服務(wù)都有一個與之關(guān)聯(lián)的團隊,該團隊完全負責服務(wù)——從確定功能范圍,到架構(gòu)、構(gòu)建和運維。
- 第二個教訓是,通過禁止客戶端直接訪問數(shù)據(jù)庫,可以在不涉及客戶端的情況下對服務(wù)狀態(tài)進行可伸縮性和可靠性改進。這些經(jīng)驗教訓與如何訪問服務(wù)有關(guān):如果你希望能夠輕松地聚合服務(wù),如果你希望插入高級基礎(chǔ)設(shè)施技術(shù),如分布式請求路由或分布式請求跟蹤,你需要一個統(tǒng)一的服務(wù)訪問機制。
- 第三個教訓:賦予開發(fā)人員運維職責大大提高了服務(wù)的質(zhì)量,無論是從客戶的角度還是從技術(shù)的角度。傳統(tǒng)的模式是,將軟件放在分隔開發(fā)和運維的墻上,然后將其拋諸腦后。在亞馬遜不是這樣,誰建立,誰運行。這使開發(fā)人員接觸到軟件的日常運維。這也讓開發(fā)人員每天都與客戶接觸。這種客戶反饋回路對提高服務(wù)質(zhì)量至關(guān)重要。
“如果不把技術(shù)用于服務(wù)客戶的更大利益上,技術(shù)就毫無用處。我們是一家強烈以客戶為導向的公司,我們經(jīng)常使用“從客戶逆向工作”的方法。這意味著,在你的思考過程中,從客戶開始,然后逆向工作,直到找到滿足新客戶需求所需的簡單而最小的技術(shù)。重要的是,來到亞馬遜工作的工程師要明白,我們不是為了技術(shù)而開發(fā)技術(shù),而是為了支持客戶。”
“面向服務(wù)的架構(gòu),我們的擴展方式,我們服務(wù)客戶的方式——我認為我們最大的成功是亞馬遜已經(jīng)成為一個其他企業(yè)可以從中受益的平臺。”
通過技術(shù)和業(yè)務(wù)的服務(wù)化,亞馬遜與用戶構(gòu)建了一個快速反饋周期,進入一個飛速增長的飛輪之中。
2006年3月啟動S3時,S3只有8項服務(wù)。到2019年,S3已達到262種服務(wù)。在與Tom Killalea的談話中,Werner Vogels 說道:“我完全同意這是空前的規(guī)模。即使在今天,即使現(xiàn)在的互聯(lián)網(wǎng)服務(wù)已經(jīng)達到了令人難以置信的規(guī)模,我認為S3仍然比它領(lǐng)先兩到三代。”
在2006年的S3發(fā)布公告中,亞馬遜采用了以下分布式系統(tǒng)設(shè)計十大原則來滿足Amazon S3的需求:
- 去中心化:使用完全去中心化的技術(shù)來消除伸縮瓶頸和單點故障。
- 異步:系統(tǒng)在任何情況下都能繼續(xù)工作。
- 自治:單個組件根據(jù)本地信息可以做出決策。
- 局部責任:每個組件負責實現(xiàn)其自身的一致性,這絕不是其他對等節(jié)點的責任。
- 受控并發(fā):操作被設(shè)計成不需要或有限的并發(fā)性控制。
- 容錯:組件故障被視為正常運行模式,并且在沒有中斷或最小中斷的情況下繼續(xù)運行。
- 受控并行:系統(tǒng)抽象具有這樣的粒度:使用并行來提高性能、恢復(fù)健壯性,或者引入新節(jié)點。
- 分解成小的、易于理解的構(gòu)建塊:不要試圖提供做所有事情的單一服務(wù),而是構(gòu)建可以用作其他服務(wù)構(gòu)建塊的小組件。
- 對稱性:系統(tǒng)中的節(jié)點在功能方面是相同的,并且不需要或最少需要特定配置才能運行。
- 簡單性:系統(tǒng)應(yīng)該盡可能地簡單,而不是更簡單。
上面的十個原則,是亞馬遜構(gòu)建大規(guī)模分布式系統(tǒng)的方式。S3只是這些設(shè)計原則的例子。
原則是灰色的,而客戶的需求常青。在上面的原則基礎(chǔ)之上,Werner Vogels提出了演化架構(gòu)。
當時,大多數(shù)科技公司提供所有東西和“平臺”,他們會提供一本很厚的書和10個不同的合作伙伴,然后告訴客戶如何使用技術(shù)。而亞馬遜沒有將自己鎖定在自己的技術(shù)中,走上了另外一條道路。杰夫.貝佐斯多年前曾說過,那就是構(gòu)建工具,而不是構(gòu)建平臺,平臺是大型軟件平臺公司提供技術(shù)服務(wù)的老方式。
“在我們開始S3之前,我們開始意識到我們所做的可能會從根本上改變軟件構(gòu)建和服務(wù)使用的方式。但我們不知道這將如何發(fā)展,所以更重要的是構(gòu)建小型、靈活的工具,讓客戶可以在其上構(gòu)建(或者我們可以在自己的基礎(chǔ)上構(gòu)建),而不是在某個特定時刻準備好所有東西和“平臺”。這不是時間問題,更重要的是,我們堅信,無論我們向S3的接口添加什么,向S3的功能添加什么,都應(yīng)該由我們的客戶驅(qū)動——以及下一代客戶將如何開始構(gòu)建他們的系統(tǒng)。”
“在過去的五到十年里,軟件發(fā)生了根本性的變化。我們需要構(gòu)建正確的工具,以支持發(fā)生根本性變化的速度。這樣,你就無法預(yù)測,你必須與你的客戶一起工作,等待他們?nèi)绾问褂媚愕墓ぞ?mdash;—特別是如果這些工具是以前從未構(gòu)建過的——并觀察他們做了什么。然后我們坐下來問自己,最小集合是什么。”
“你必須有意識地小心設(shè)計API。API是長遠的。一旦你把API放在那里,也許你可以提供新版本,但你不能把它從你的客戶那里拿走。在API設(shè)計中保持保守和最小化可以幫助你構(gòu)建基本工具,你可以在這些工具上添加更多的功能,或者合作伙伴可以在其之上構(gòu)建新的層次,或者你可以將不同的構(gòu)建塊組合在一起。這就是我們從一開始的理念:做到極簡主義,這樣我們就可以讓我們的客戶來推動將要發(fā)生的事情,而不是我們坐在后面的房間里思考:這個世界應(yīng)該是什么樣子。”
這些設(shè)計決策在亞馬遜的數(shù)據(jù)湖中得到了體現(xiàn)?;跇?gòu)建塊和工具,S3的作用遠遠超過了數(shù)據(jù)湖:圍繞著數(shù)據(jù)庫,S3提供了龐大的工具箱(175種不同的服務(wù))。
在訪談中,S3的設(shè)計決策還包括:
- 持久性大于可用性
- 不變性大于分布式鎖
- 計算和存儲分離
不要將自己鎖定在自己的架構(gòu)中。Werner Vogels 在回顧S3的設(shè)計原則時候,這樣說道。一個有效的復(fù)雜系統(tǒng)總是從一個有效的簡單系統(tǒng)演化而來。一個從零開始設(shè)計的復(fù)雜系統(tǒng)永遠不會工作,也不能通過修補使其工作。你必須從一個簡單可行的系統(tǒng)開始。
也許讀者不需要去閱讀兩篇訪談的原文,但需要記住和思考的是本文總結(jié)的幾點:服務(wù)意識、分布式系統(tǒng)設(shè)計十大原則、構(gòu)建工具而不是平臺、不要將自己鎖定在自己的架構(gòu)中。
【本文是51CTO專欄作者石頭的原創(chuàng)文章,轉(zhuǎn)載請通過作者微信公眾號補天遺石(butianys)獲取授權(quán)】