如何?一個分布式 RPC 架構_實現

來源:互聯網
上載者:User

遠端程序呼叫(Remote Procedure Call,RPC)是一個電腦通訊協定。該協議允許運行於一台電腦的程式調用另一台電腦的子程式,而程式員無需額外地為這個互動作用編程。RPC的主要目標是讓構建分布式應用更加容易,在提供強大的遠程調用能力的同時不損失本地調用的語義的簡潔性。

趁實習前的這段業餘時間,我實現了一個輕量級的分布式RPC架構,名字叫做 buddha,代碼量不大,但是麻雀雖小卻五髒俱全。本篇文章將一步步闡明buddha的設計、架構組件的拆解以及需要考慮的因素。 序列化與還原序列化

在網路中,所有的資料都將會被轉化為位元組進行傳送,所以在代碼層面上,一個RPC架構需要實現特定格式的資料與位元組數組之間的相互轉化。像Java已經提供了預設的序列化方式,但是如果是在高並發的情境下,使用Java原生的序列化方式可能會遇到效能瓶頸。於是,出現了許多開源的、高效的序列化架構:如Kryo、fastjson和Protobuf等。buddha目前支援Kryo和fastjson兩種序列化架構。 TCP拆包、粘包

由於TCP只關心位元組流,並不知曉上層的資料格式。如果用戶端應用程式層一次要發送的資料過大時,TCP會將該資料進行分解傳送,因此在服務端需要進行粘包處理(由TCP來保證資料的有序性);如果用戶端一次要發送的資料量很小時,TCP並不會馬上把資料發送出去,而是將其儲存在緩衝區,當達到某個閾值的時候再發送出去,因此在服務端需要進行拆包的工作。

通過以上分析,我們瞭解了TCP粘包或者拆包的原因,解決這個問題的關鍵在於向資料包添加邊界資訊,常用的方法有如下三個。 發送端給每個資料包添加包首部,首部中至少包含資料包的長度,這樣在接收端接收到資料時,通過讀取首部的長度資訊得到該資料包有效資料的長度。 發送端將每個資料包封裝為固定長度(多餘用0填充),這樣接收端在接收到資料後根據約定好的固定長度讀取每個資料包的資料。 使用特殊符號將每個資料包區分開來,接收端也是通過該特殊符號的劃分資料包的邊界。

buddha採用第一種方式來解決TCP拆包、粘包的問題。 BIO與NIO

BIO往往用於經典的每串連每執行緒模式,之所以使用多線程,是因為像accept()、read()和write()等函數都是同步阻塞的,這意味著當應用為單線程且進行IO操作時,如果線程阻塞那麼該應用必然會進入掛死狀態,但是實際上此時CPU是處於空閑狀態的。開啟多線程,就可以讓CPU去為更多的線程服務,提高CPU的利用率。但是在活躍線程數較多的情況下,採用多執行緒模式回帶來如下幾個問題。 線程的建立和銷毀代價頗高,在Linux作業系統中,線程本質上就是一個進程,建立和銷毀線程屬於重量級的操作。 在JVM中,每個線程會佔用固定大小的棧空間,而JVM的記憶體空間是有限的,因此如果線程數量過多那麼線程本身就會佔據過多的資源。 線程的切換成本較高,每次線程切換需要涉及內容相關的儲存、恢複以及使用者態和核心態的切換。如果線程數過多,那麼會有較大比例的CPU時間花費線上程切換上。

使用線程池的方式解決前兩個問題,但是線程切換帶來的開銷還是存在。所以在高並發的情境下,傳統的BIO是無能為力的。而NIO的重要特點是:讀、寫、註冊和接收函數,在等待就緒階段都是非阻塞的,可以立即返回,這就允許我們不使用多線程充分利用CPU。如果一個串連不能讀寫,可以把這個事件記錄下來,然後切換到別的就緒的串連進行資料讀寫。在buddha中,Netty被用來編寫結構更加清晰的NIO程式。 服務註冊與發現

在實際應用中,RPC服務的提供者往往需要使用叢集來保證服務的穩定性與可靠性。因此需要實現一個服務註冊中心,服務提供者將當前可用的服務地址資訊註冊至註冊中心,而用戶端在進行遠程調用時,先通過服務註冊中心擷取當前可用的服務列表,然後擷取具體的服務提供者的地址資訊(該階段可以進行負載平衡),根據地址資訊向服務提供者發起調用。用戶端可以緩衝可用服務列表,當註冊中心的服務列表發生變更時需要通知用戶端。同時,當服務提供者變為不可用狀態時也需要通知註冊中心服務不可用。buddha使用ZooKeeper實現服務註冊與發現功能。 代碼實現

buddha是我學習驗證RPC過程中誕生的一個輕量級分布式RPC架構,代碼放在了 GitHub。 參考 RPC 的概念性模型與實現解析 NettyRpc from: 辰洋 http://www.importnew.com/26604.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.