很多小夥伴都遇到過需要為分布式系統呼叫更換rpc的問題,為什麼會遇到這種事呢?其實,在系統搭建初期,需求簡單,架構簡單,最重要的是請求量也少,所以很多系統都採用快速原型開發模式,對rpc的要求不高,隨便找乙個順手的或者熟悉的rpc框架套進系統中即可。但是隨著業務複雜度增高,系統承載的請求量增高,可能一開始所採用的rpc框架顯現出一些致命的問題,比如大扇出問題。我們以thrift為例。例如隨著業務複雜度的增長,我們面臨著如下的需求。
如圖所示,每一次請求,上游服務都要獲取下游a~z一共26個服務的結果,然後把這26個服務的結果拼裝返回給前端服務。有人說,26個服務是不是有些誇張了,我的系統中根本沒有遇到過這個情況。這實際一點不誇張,乙個業務複雜的系統經過服務拆分,最後拆成一些高內聚低耦合的獨立服務,非常容易達到這樣乙個服務種類數,而且26還遠遠不是很多。那麼遇到這種問題,傳統的同步的rpc怎麼解決這個問題呢?
以thrift為例,如果需要訪問26個服務,為了保證請求處理速度,必須要並行訪問各個下游服務(不能序列請求,因為這將導致 一次請求的響應時間至少為timea + timeb + ...... + timez),那麼我們只能通過多執行緒進行併發。
通過多執行緒併發請求,我們基本能夠達到處理一次請求至多需要 max(timea, timeb, ......, timez),但是實際上要比這個稍多。看樣子我們必須弄乙個請求執行緒池,可是這個池子要多大呢?假如現在前端請求速率為 p,那麼為了保證每個請求處理時間都盡可能快,我們需要乙個大小為 26 * p的執行緒池。雖然,初看起來可能還可以應付,畢竟請求執行緒在傳送網路請求後,會阻塞在io,它會放棄cpu,從而使得計算執行緒獲得cpu,不會浪費多少cpu的資源,但是當p太大就不好了。比如p為100或者1000,這個時候執行緒數過多可能就會造成cpu排程開銷增大,因為它會增加cpu的執行緒切換負擔。
所以,我們更換rpc,當且僅當,當前的rpc已經造成了系統負擔,對於業務量不大的系統,rpc的更換並沒有必要,但是為了技術提公升你也可以更換rpc,只不過收益可能不大。
考慮到thrift對於大扇出並不合適,我們可能需要下面這樣工作模式的rpc。
這種反應器模型(只是簡單舉例子)可以減少請求執行緒數。這種rpc使用系統的epoll進行後端服務的請求以及資料的接收,這樣無論多少請求,只使用乙個執行緒完成,通過epoll的機制在資料到來或者可傳送的情況下通知使用者程序,只不過最後需要把接收到的資料返回給計算執行緒使用。這種模型其實要比thrift那種那好一些。我自己也在業餘時間實現了乙個簡單的rpc框架: ,比較粗糙但是足夠小。
還有有很多開源的rpc框架,fbthrift,grpc都可以應對大扇出,找到適合你的系統,並且改動量和後期維護成本最低的那個。
把系統遷移到新的rpc上,除了改動**外,就是要做到相容,系統在遷移過程中可能需要在兩套rpc框架上執行,並且必須做到平滑遷移。例如,一般的分布式系統可能會長成如下的樣子。
服務b1~b4把自己的位址寫入到etcd中,但是由於我們一開始並未考慮到rpc的遷移,所以value對應的是服務的位址,沒有服務使用的rpc型別等等。
方案1 新增新key
對於a1a2,b1b4,可以先選擇一部分進行平滑過渡,例如我們選擇a1,b1~b2進行遷移。
上線步驟如下:
通過這種方式,我們可以平滑的進行服務遷移。但是它的缺點很明顯,需要乙個新的key,而且後期還需要一點點把服務挪回到舊的key上。
方案2 **相容
這個方案必須更改一些解析**,使其能夠相容新的etcd中value的格式,如下圖。
通過這個步驟,我們就能做到rpc的平滑遷移。這個方式的缺點也有:需要同時維護兩套rpc框架,直到其中一種rpc徹底下線。但是優點也有,沒有增加新key。
更換rpc並不像想象中的那樣困難,只要理清前後邏輯,一點點的遷移,最終你的服務會全部搞定。最重要的問題是你的系統真的達到了非得換rpc的地步了麼?
如何理解分布式系統
你女朋友是高可用麼?分布式系統的概念,技術 於戀愛,又高於戀愛 1.高可用 就算失戀了,可以迅速和另乙個女生戀愛,永遠不會是單身狀態 2.註冊中心 你和你女朋友去民政局登記,民政局就是註冊中心,掉線的代價就是離婚 3.負載均衡 你和多個女朋友輪流約會。星期一,三,五跟a約會,二,四,六和b約會,叫r...
如何學習分布式系統
2019年,做大資料的開發已經6年了,這期間分布式系統的知識學習了不少,但基本都是 於專案需要而零敲碎打,沒有系統性的融會貫通提綱挈領,在一件小事的觸動之下,決定將分布式系統做一次系統性的學習。網上搜尋 如何系統性的學習分布式系統 得到的答案除了知識點過於零散的,剩下就是不適合我的實際情況的,主要因...
分布式 分布式系統的設計
在計算機領域,當單機效能達到瓶頸時,一般有兩種方式解決效能問題 而分布式系統的設計說白了就是 如何合理將乙個系統拆分成多個子系統部署到不同機器上。講設計方法前,先介紹分布式系統的特性 1 分布性 空間中隨機分布。這些計算機可以分布在不同的機房,不同的城市,甚至不同的國家。2 對等性 分布式系統中的計...