本文轉載自 TimYang 的部落格。
大型軟體系統開發需要模組化,在分散式系統中,模組化通常是將功能分成不同的遠端服務(RPC)來實現。比如可以用Java RMI、Web Service、Facebook開源的Thrift等一些技術。同樣,在一個大型系統中,服務化之後服務的可維護、可管理、可監控以及高可用、負載均衡等因素同服務本身同樣重要。
服務管理目前並無直接解決方案,Thrift作者Mark Slee提到
It’s also possible to use Thrift to actually build a services management tool. i.e. have a central Thrift service that can be queried to find out information about which hosts are running which services. We have done this internally, and would share more details or open source it, but it’s a bit too particular to the way our network is set up and how we cache data. The gist of it, though, is that you have a highly available meta-service that you use to configure your actual application server/clients.
Source: [Thrift] Handling failover and high availability with thriftservices
如果開發一個自己的服務管理框架,需要具備以下功能
- 快速失敗,這個在本廠意義重大,很多遠端服務呼叫是在關鍵路徑中,它可以容忍失敗,但是不能容忍堵塞
- failover,客戶端failover支援,並支援自動失效探測及恢復呼叫
- 中心化配置及推送功能,所有client在同一時刻配置的一致性,並且client會跟配置中心保持長連
- 負載均衡策略:支援round robin,least active, consistent hash,或者基於指令碼的動態路由策略。這個都是由配置中心來控制
- 動態啟用及停用服務及節點:可以動態啟動及停用服務(熱釋出),由於有推送功能,相對容易實現
- 跨語言:支援client能使用常見主流語言來訪問
- 版本管理:同一服務可以有不同的版本並存
- 訪問統計及動態執行引數檢視:可以對方法級別進行訪問統計及實時觀察
訪問策略
服務框架傾向於直連的方案,即client是直接連線server,而不會增加中間物理上的代理層,服務框架只做中心配置、訪問策略、服務發現、配置通知等職責。
路由的特殊需求
通常的服務訪問,使用上述round robin等3種策略即可,但是在實際工程實踐中,我們發現有些不同的需求。比如計數這樣的遠端服務,讀操作可隨機訪問一臺遠端節點,但寫操作需要訪問所有的服務節點才能實現。因此我們需要有廣播式的訪問需求。由於計數服務對實時性和一致性要求較高,不適合採用非同步如Pub/Sub這樣方式去實現,因此在 client還需要支援同步的廣播呼叫。
耦合及侵入的矛盾
在設計服務管理系統之前,我們希望不跟一種具體的技術(如Thrift)繫結,比如client和server服務實現方不需要太多關心底層技術。但是在實際實現過程中碰到不少矛盾。
IDL侵入
在使用Thrift之後服務實現很難繞過Thrift IDL,使用方需要自己維護IDL以及Thrift生成的程式碼,服務框架支援將Thrift服務註冊到配置系統中。雖然也可以繞過IDL來實現服務,但是框架相關功能的實現和維護成本比較高。
RPC框架的侵入
Thrift Transport可以使用TCP(Socket)或者是HTTP
這個也是非常好的特性,在某些情況Transport使用HTTP會帶來很多便利,使用HTTP雖然有一些額外開銷,但是HTTP的周邊配套設施的完善足夠抵消這種開銷。使用TCP很多狀態實時監控都需要服務系統從頭做起。
Thrift的Version與服務的version存在一定的重複
服務牽涉到版本管理,我們希望通過發現服務來管理,但是Thrift本身也有版本的設計。
這些矛盾的本質就是服務框架需要的一些功能是自己實現還是依賴Thrift來實現,很多Thrift使用方如Twitter rpc-client乾脆就直接在Thrift框架基礎上增強。
雖然存在上述一些待解決問題,廠內第一個使用服務框架管理的服務即將上線,很快每天會有數十億的呼叫將會在此之上產生,同時也會有新的挑戰出現。