分布式計算的第一準(zhǔn)則——不要分布你的對象
減少訪問遠(yuǎn)程服務(wù)所花費的時間,比如可以通過更粗粒度地劃分接口。遠(yuǎn)程還是本地是明確的設(shè)計決策休蟹,不能隨意來回更動沸枯,這一點應(yīng)當(dāng)牢記。還要考慮分布式計算的第一準(zhǔn)則——不要分布你的對象赂弓。
軟件開發(fā)人員總愛在不需要的地方引入抽象和層绑榴。是的,這些概念對軟件組件之間的解耦來說是很好的工具盈魁,但它們可能會增加復(fù)雜性翔怎、影響性能,尤其是在每層的數(shù)據(jù)表示之間都需要轉(zhuǎn)換的情況下杨耙。因此赤套,減少處理時間還要注意保證抽象不要過于抽象化,并且沒有過多的分層珊膜。另外容握,對于我們視為理所當(dāng)然的運行時服務(wù),有必要理解其成本车柠,因為除非它們提供了特定的服務(wù)水平協(xié)議剔氏,否則很有可能最終會成為應(yīng)用中的瓶頸。
分布式必然帶來復(fù)雜性的上升, 網(wǎng)絡(luò)是不可靠的. 跨越網(wǎng)絡(luò)帶來的復(fù)雜性如果不能通過分層協(xié)議在網(wǎng)絡(luò)兩端取得同步和一致的結(jié)果, 對于應(yīng)用就會造成數(shù)據(jù)不一致的后果.
現(xiàn)狀:
HTTP作為最通用的應(yīng)用層協(xié)議, 承擔(dān)了互聯(lián)網(wǎng)上多數(shù)的數(shù)據(jù)傳輸任務(wù).
TCP/IP和OSI模型相比, 精簡掉了會話和表示層, 把這些功能合并在應(yīng)用層處理. 雖然簡化了網(wǎng)絡(luò)的設(shè)計和實現(xiàn), 卻給上層的應(yīng)用帶來了更多的維護(hù)負(fù)擔(dān).
最好把數(shù)據(jù)協(xié)議和傳輸協(xié)議分開, 雖然現(xiàn)在HTTP是Web標(biāo)準(zhǔn), 但是面向未來, 最好不要捆綁在特定的傳輸協(xié)議上, 只做好Web可用的數(shù)據(jù)訪問接口, 底層使用websocket, 或者HTTP2, HTTP3, 或者別的什么協(xié)議都可以. 這個問題其實是由于TCP/IP協(xié)議簡化的應(yīng)用層造成的, OSI模型中的會話層和表示層是有必要的, 而且并不需要特殊硬件, 應(yīng)該是在軟件中分層. 把所有功能都簡化到應(yīng)用層的后果就是HTTP承擔(dān)了太多角色, 沒有一個清晰的層次, 導(dǎo)致了Web開發(fā)需要后端寫很多難以復(fù)用的接口. 所以REST和GraphQL都在填這個坑, 我覺得最根本的方式還是重視OSI模型, 在軟件架構(gòu)中分離出會話和表示層, 建立起通用規(guī)范的實現(xiàn)和接口調(diào)用方式, 這樣不僅對于Web, 對于更底層直接基于socket的調(diào)用都是大有好處的, 現(xiàn)在的情況下是這些功能分布于通訊框架和業(yè)務(wù)代碼中, 沒有一個清晰的結(jié)構(gòu), 增加了復(fù)雜性. 當(dāng)然, 這是從長遠(yuǎn)和理想角度考慮, 目前HTTP接口還是夠用的, 前端通過對應(yīng)的客戶端庫轉(zhuǎn)接相應(yīng)格式的接口, 后續(xù)切換應(yīng)該也問題不大.
Web技術(shù)出現(xiàn)的較晚(約1990年), 而市場對于互聯(lián)網(wǎng)應(yīng)用的需求卻很強烈, 導(dǎo)致Web在底層技術(shù)還沒有準(zhǔn)備好的情況下就要開始承擔(dān)復(fù)雜的業(yè)務(wù)場景. 這是網(wǎng)絡(luò)應(yīng)用開發(fā)中的根本問題.
近些年Web標(biāo)準(zhǔn)作了一些升級和調(diào)整, 諸如HTML5, CSS3, ES6之類的標(biāo)準(zhǔn), 為web應(yīng)用提供了更多的可能, 但是作為傳輸主力的HTTP卻調(diào)整緩慢.
HTTP/0.9 1990
HTTPS 1994
HTTP1.0 1996
HTTP1.1 1997
|
|
WebSocket 2011
SPDY 2012
HTTP/2 2015
HTTP為了實現(xiàn)的簡單, 處于當(dāng)時網(wǎng)絡(luò)的實際情況和應(yīng)用場景, 采取了一問一答, 無狀態(tài)的純文本格式傳輸模式. 相當(dāng)于在不關(guān)心會話層實現(xiàn), 表示層采用text/html或text/plain這樣的簡單文本格式. 在當(dāng)時傳輸簡單圖文的場景下是夠用且合適的, 但是當(dāng)需求和應(yīng)用越來越復(fù)雜, 簡單的文本和html格式無法承擔(dān). 當(dāng)時的W3C委員會制定的標(biāo)準(zhǔn)是XML, 建立一套基于XML的體系, 希望以此統(tǒng)一Web數(shù)據(jù)的承載格式. 但是之后業(yè)界更傾向于輕量級的JSON格式.