云將會(huì)走向終結(jié)。一直以來(lái),都有這樣的一個(gè)傳統(tǒng)觀點(diǎn):運(yùn)行服務(wù)器的應(yīng)用程序,無(wú)論是 Web 應(yīng)用還是移動(dòng)應(yīng)用的后臺(tái),未來(lái)都會(huì)在云端。亞馬遜、谷歌和微軟在他們的云服務(wù)中添加了多種工具,讓運(yùn)行的軟件服務(wù)變得越來(lái)越簡(jiǎn)單方便,因此,在 AWS 、GCP 或 Azure 上托管代碼是你能到的最好的事情 —— 它方便、便宜、容易實(shí)現(xiàn)自動(dòng)化,你可以靈活地控制規(guī)模。
那么,為什么我要預(yù)測(cè)這一切都會(huì)結(jié)束呢?有這么幾個(gè)原因:
它無(wú)法滿足長(zhǎng)期的擴(kuò)展要求
構(gòu)建一個(gè)可擴(kuò)展、可靠、高可用性的 Web 應(yīng)用程序,即使是在云中也相當(dāng)困難。如果你做得不錯(cuò),那么龐大的規(guī)模將會(huì)耗盡你的金錢(qián)和精力,最終會(huì)達(dá)到云計(jì)算的極限:計(jì)算機(jī)的計(jì)算速度和存儲(chǔ)容量的增長(zhǎng)速度超過(guò)了網(wǎng)絡(luò)的帶寬。
這之所以是一個(gè)問(wèn)題,主要是因?yàn)槲覀兘M織網(wǎng)絡(luò)的方式。有許多用戶想要獲得內(nèi)容和使用程序,而只有相對(duì)較少的服務(wù)器擁有這些。比如當(dāng)我在 Slack 上看到一張搞笑的照片時(shí),想向坐在我身邊的 20 個(gè)人分享,但他們都必須從托管服務(wù)的服務(wù)器上下載,服務(wù)器需要發(fā)送 20 次這個(gè)照片。
隨著服務(wù)器轉(zhuǎn)移到云端,這需要有巨大的吞吐量來(lái)處理這些數(shù)據(jù)。此外,還必須有大量的硬盤(pán)來(lái)存儲(chǔ) CPU 數(shù)據(jù),再通過(guò)網(wǎng)絡(luò)將數(shù)據(jù)傳輸給每一個(gè)想要的人。
它是集中而脆弱的
集中存儲(chǔ)數(shù)據(jù)和程序的另一個(gè)問(wèn)題是可用性和持久性。我們通常通過(guò)將數(shù)據(jù)存儲(chǔ)在多個(gè)位置來(lái)緩解這個(gè)問(wèn)題,但這需要更多的數(shù)據(jù)中心。雖然這樣可能會(huì)大大降低意外損失的風(fēng)險(xiǎn),但你非常關(guān)心的數(shù)據(jù)又該怎么辦呢?
婚禮視頻、孩子的照片、或重要的信息來(lái)源,所有這些信息都存儲(chǔ)在云端( Facebook、Google Drive 等),即使它們不會(huì)發(fā)展到停止運(yùn)營(yíng)這一步,但也會(huì)限制你訪問(wèn)自己數(shù)據(jù)的方式,你和你的朋友必須去使用它們的服務(wù)。
它需要信任,但沒(méi)法提供保障
使用云服務(wù),你要讓朋友相信他們得到的數(shù)據(jù)是你發(fā)送的,而且這個(gè)數(shù)據(jù)是通過(guò)值得信任的中間人傳遞過(guò)來(lái)的。在大多數(shù)情況下,這都能夠良性運(yùn)轉(zhuǎn),但我們使用的網(wǎng)站和網(wǎng)絡(luò)必須要注冊(cè)才能合法運(yùn)營(yíng),監(jiān)管部門(mén)有權(quán)力強(qiáng)迫它們做很多事情。
這是一件好事,可以用來(lái)幫助解決犯罪或從網(wǎng)絡(luò)上刪除非法內(nèi)容,但也有很多情況下,這種權(quán)力被濫用。
它讓我們的數(shù)據(jù)更容易遭受攻擊
互聯(lián)網(wǎng)真正可怕的一面是個(gè)人數(shù)據(jù)的集中化。那些為我們提供服務(wù)的大公司都有大量的數(shù)據(jù) —— 這些數(shù)據(jù)包含了足夠的信息,可以預(yù)測(cè)你將要購(gòu)買(mǎi)什么,你會(huì)投票給誰(shuí),你可能會(huì)買(mǎi)房子,甚至你可能會(huì)有多少孩子。這些信息足以用你的名義去辦理一張信用卡、一筆貸款,甚至是用你的名字買(mǎi)一所房子。
今年早些時(shí)候,信用報(bào)告機(jī)構(gòu) Equifax 丟失了 1.4 億名客戶的數(shù)據(jù),這是歷史上最大的數(shù)據(jù)泄露事件之一。真正阻止這類事件再發(fā)生的唯一辦法是:一開(kāi)始就不收集這么大規(guī)模的數(shù)據(jù)。
什么將取代云?
在這個(gè)領(lǐng)域,我已經(jīng)閱讀了大量的文獻(xiàn),并且已經(jīng)非常確信點(diǎn)對(duì)點(diǎn)是我們未來(lái)的發(fā)展方向。點(diǎn)對(duì)點(diǎn)技術(shù)是用協(xié)議和策略來(lái)取代我們所知道的網(wǎng)絡(luò)構(gòu)建模塊,解決我上面提到的大部分問(wèn)題。目標(biāo)是完全分布式的,永久冗余的數(shù)據(jù)存儲(chǔ),每個(gè)參與網(wǎng)絡(luò)的用戶都在存儲(chǔ)其中一些可用數(shù)據(jù)的副本。
如果你聽(tīng)說(shuō)過(guò) BitTorrent(比特流),那么下面這些內(nèi)容聽(tīng)起來(lái)應(yīng)該會(huì)很熟悉。在 BitTorrent 上,要下載一個(gè)文件,你只需要一個(gè)”內(nèi)容指紋“就行了。然后你的 BitTorrent 客戶端將會(huì)按照”內(nèi)容指紋“找到那些擁有文件片段的用戶,并從他們那里把一個(gè)個(gè)文件片段下載下來(lái)。
一個(gè)有趣的點(diǎn)是如何去匹配用戶。BitTorrent 使用了名為 Kademlia 的協(xié)議。在 Kademlia 里,網(wǎng)絡(luò)上的每個(gè)對(duì)等點(diǎn)都有唯一的 ID 號(hào),其長(zhǎng)度與唯一的塊 ID 相同。不過(guò),塊 ID 并不需要隨機(jī)選擇,而是使用一種加密散列,能夠保證用戶不可能下載原始的數(shù)據(jù)之外的其他數(shù)據(jù)。
另一個(gè)有趣的特性是,通過(guò)將一個(gè)塊的 ID 嵌入到另一個(gè)塊的內(nèi)容中,你可以將二者以一種不會(huì)被篡改的方式連接在一起。如果鏈接塊的內(nèi)容發(fā)生變化,它的 ID 將會(huì)改變,鏈接也會(huì)被破壞。如果修改了嵌入式鏈接,那么包含塊的 ID 也會(huì)隨之改變。
這種將一個(gè)區(qū)塊的 ID 嵌入到另一個(gè)區(qū)塊的機(jī)制,使得創(chuàng)建這樣的區(qū)塊鏈成為可能甚至是更復(fù)雜的結(jié)構(gòu),通常被稱為有向無(wú)環(huán)圖( Directed Acyclic Graphs ),簡(jiǎn)稱 DAG 。
Merkle DAG 的一個(gè)常見(jiàn)例子就是 Git 存儲(chǔ)庫(kù)。Git 將提交歷史和所有目錄和文件都保存在一個(gè)巨大的 Merkle DAG 中,在這個(gè)新網(wǎng)絡(luò)上,每一張獨(dú)一無(wú)二的圖片都只存在一次。
像 Kademlia 、Merkle 鏈和 Merkle DAG 這樣的協(xié)議,給我們提供了建模文件層次和修訂時(shí)間線的工具,并在一個(gè)大型的 P2P 網(wǎng)絡(luò)中分享它們。目前已經(jīng)有一些協(xié)議使用這些技術(shù)來(lái)構(gòu)建符合我們需求的分布式存儲(chǔ),看起來(lái)很有希望的是 IPFS 。
名稱和共享問(wèn)題
通過(guò)以上這些技術(shù),我們可以解決我在開(kāi)始時(shí)提出的問(wèn)題,這些設(shè)備可以記錄文件的歷史,并在需要的時(shí)候保留所有版本。這幾乎解決了可用性、容量、持久性和內(nèi)容驗(yàn)證問(wèn)題,甚至還解決了帶寬問(wèn)題。
所以現(xiàn)在我在 Slack 上看到的圖片可以來(lái)自我旁邊的同事,而不是來(lái)自 Slack 的服務(wù)器。不過(guò),如果要發(fā)布一張照片,我需要更新一個(gè)通道( channel ),這個(gè)聽(tīng)起來(lái)相當(dāng)簡(jiǎn)單的事情卻是整個(gè)體系中最難的部分。
最困難的部分:實(shí)時(shí)更新
一個(gè)實(shí)體的概念會(huì)隨著時(shí)間的推移而改變,這實(shí)際上只是人類專屬的想法,讓世界在我們的頭腦中擁有秩序感和穩(wěn)定。我們還可以把這樣的實(shí)體看作是一個(gè)身份或名稱,隨著時(shí)間的推移,它會(huì)呈現(xiàn)出一系列不同的價(jià)值。在電腦中模擬信息是一種更自然的方式,會(huì)產(chǎn)生更自然的結(jié)果。
在中心化的系統(tǒng)中,幾乎所有的 Web 應(yīng)用程序都有一個(gè)中央實(shí)體來(lái)決定這個(gè)結(jié)果,并對(duì)事件進(jìn)行序列化。然而在一個(gè)分布式系統(tǒng)中,每個(gè)人都是平等的,因此需要有一種機(jī)制來(lái)確保網(wǎng)絡(luò)上能夠達(dá)成共識(shí)。
對(duì)于一個(gè)真正的分布式網(wǎng)絡(luò)來(lái)說(shuō),要想解決這個(gè)問(wèn)題,最困難的問(wèn)題就是我們今天正在使用的所有應(yīng)用。它不僅會(huì)影響并發(fā)更新,還會(huì)影響其他需要“實(shí)時(shí)”更新的更新 —— 隨著時(shí)間的推移,“真相的單一來(lái)源”正在發(fā)生變化。這個(gè)問(wèn)題對(duì)于數(shù)據(jù)庫(kù)來(lái)說(shuō)尤其困難,它也會(huì)影響到其他關(guān)鍵服務(wù),比如 DNS 。
公共文件網(wǎng)絡(luò)中的隱私問(wèn)題
需要解決的一個(gè)明顯問(wèn)題是:如何在不公開(kāi)的情況下將內(nèi)容存儲(chǔ)在分布式的集群中。本質(zhì)上我們有三個(gè)層次的隱私:公共的、隱藏的和私密的。
依賴加密技術(shù)一開(kāi)始可能聽(tīng)起來(lái)很冒險(xiǎn),但實(shí)際上并沒(méi)有比我們今天做的更糟糕。如果我們轉(zhuǎn)而以一種本質(zhì)上是公開(kāi)的方式來(lái)存儲(chǔ)私人數(shù)據(jù),那么我們就不得不保護(hù)它,這樣對(duì)任何獲得訪問(wèn)權(quán)限的人來(lái)說(shuō)都是不好的。
這一領(lǐng)域有趣的挑戰(zhàn)是:在一群需要隨時(shí)間推移而改變的人群中,建立一個(gè)能夠驗(yàn)證身份并共享私有數(shù)據(jù)的良好系統(tǒng)。
從云到霧
盡管要解決一些難題,我們從云計(jì)算中遷移出去,將會(huì)是一個(gè)非常令人興奮的未來(lái)。
首先,在技術(shù)方面,我們應(yīng)該從點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)中獲得相當(dāng)多的改進(jìn)。內(nèi)容可尋址存儲(chǔ)、可以在不受信任的授權(quán)情況下,提供對(duì)內(nèi)容本身的加密驗(yàn)證,并進(jìn)行永久的托管。在某個(gè)時(shí)候,甚至連數(shù)據(jù)中心都可能成為歷史。
對(duì)于運(yùn)行 Web 應(yīng)用程序的企業(yè)來(lái)說(shuō),這一變化將會(huì)節(jié)省巨大的成本。企業(yè)也將能夠減少對(duì)宕機(jī)風(fēng)險(xiǎn)的關(guān)注,更多地關(guān)注增加客戶價(jià)值,讓所有人受益。我們?nèi)匀恍枰仆泄芊⻊?wù)器,但它們只是眾多同類服務(wù)器中的一種。
對(duì)企業(yè)和客戶來(lái)說(shuō),另一個(gè)巨大的好處是對(duì)客戶數(shù)據(jù)的處理。當(dāng)不再需要集中存儲(chǔ)大量的客戶信息時(shí),丟失這些數(shù)據(jù)的風(fēng)險(xiǎn)就會(huì)降低。軟件工程界的領(lǐng)導(dǎo)者們一直認(rèn)為:在互聯(lián)網(wǎng)上,客戶向企業(yè)的程序發(fā)送數(shù)據(jù)的設(shè)計(jì)是一種退化,企業(yè)應(yīng)該向客戶發(fā)送程序,以讓他們能夠執(zhí)行私人的數(shù)據(jù),而這些數(shù)據(jù)不會(huì)被直接共享。這樣的模式似乎更安全,并且也不會(huì)以任何方式阻止企業(yè)收集他們所需的有用的用戶指標(biāo)。
這種類型的應(yīng)用程序架構(gòu)似乎是一種更自然的方式,來(lái)提供大規(guī)模計(jì)算和軟件服務(wù),而且也更接近于開(kāi)放信息交換的想法,任何人都可以方便地向他人轉(zhuǎn)發(fā)內(nèi)容,并控制可以發(fā)布和訪問(wèn)的內(nèi)容,而不是由擁有服務(wù)器的私有實(shí)體來(lái)控制。
對(duì)我來(lái)說(shuō),這是非常令人興奮的。這就是為什么我想要組建一個(gè)小團(tuán)隊(duì),在幾周內(nèi)用上面提到的一些技術(shù)來(lái)構(gòu)建一個(gè)簡(jiǎn)單的移動(dòng)應(yīng)用來(lái)證明概念,并展示可以通過(guò)點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)來(lái)做些什么。
目前我所擁有的唯一一個(gè)足夠小的想法,能夠相對(duì)快速、足夠有趣,足以證明這種方法的特性是一個(gè)點(diǎn)對(duì)點(diǎn)的、真正無(wú)服務(wù)器的克隆版 Twitter ,但這并不特別令人興奮。