1. 程式人生 > >Motan:支撐微博千億呼叫的輕量級RPC框架

Motan:支撐微博千億呼叫的輕量級RPC框架

作者:李慶豐,微博研發中心研發總監,負責微博訊息箱及開放平臺的技術研發工作。微博Motan RPC框架專案負責人。十年網際網路架構研發及技術管理經驗,專注高效能高可用架構。
本文為《程式設計師》原創文章,未經允許不得轉載,更多精彩文章請訂閱2016年《程式設計師》

Motan(https://github.com/weibocom/motan)是微博技術團隊研發的基於Java的輕量級RPC框架,已在內部大規模應用多年,每天穩定支撐微博上億次的內部呼叫。

RPC呼叫優勢

隨著公司業務發展,微博內部呼叫和依賴越來越多,傳統方式逐漸顯現出弊端。

  1. jar包依賴呼叫使得服務間耦合太緊,相互影響,同時也存在跨語言呼叫問題;
  2. HTTP依賴呼叫在協議上比較重,常在效能和效率上出現瓶頸。

越是大型複雜的系統,越需要輕量的依賴呼叫方式,RPC依賴呼叫很好地解決了上述問題。

典型RPC框架對比

目前,業界RPC框架大致分為兩類,一種偏重服務治理,另一種側重跨語言呼叫。服務治理型的RPC框架代表是Dubbo和DubboX。前者是阿里開源的分散式服務框架,實現高效能的RPC呼叫同時提供了豐富的管理功能,是一款應用廣泛的優秀RPC框架,但現在維護更新較少。後者則是噹噹基於Dubbo擴充套件,支援REST風格的遠端呼叫、Kryo/FST序列化,增加了一些新功能。

這類RPC框架的特點是功能豐富,提供高效能遠端呼叫、服務發現及服務治理能力,適用於大型服務的解耦及治理,對於特定語言(如Java)專案可以實現透明化接入。缺點是語言耦合度較高,跨語言支援難度較大。

跨語言呼叫型RPC框架有Thrift、gRPC、Hessian、Hprose等。這類框架側重於服務的跨語言呼叫,能支援大部分語言,從而進行語言無關呼叫,非常適合多語言呼叫場景。但這類框架沒有服務發現相關機制,實際使用時需要代理層進行請求轉發和負載均衡策略控制。

Motan傾向於服務治理型,跨語言方面正在嘗試與PHP呼叫整合。與Dubbo系列相比,功能或許不那麼全,擴充套件實現也沒那麼多,但更注重簡單、易用以及高併發高可用場景。

功能特點

Motan是一套輕量級的RPC框架,具有服務治理能力,簡單、易用、高可用。其主要特色如下:

  1. 無侵入整合、簡單易用,通過Spring配置方式,無需額外程式碼即可整合分散式呼叫能力;
  2. 整合服務發現和服務治理能力,靈活支援多種配置管理元件,如Consul、ZooKeeper等;
  3. 支援自定義動態負載均衡、跨機房流量調整等高階服務排程能力;
  4. 基於高併發、高負載場景優化,具備Failover、Failfast能力,保障RPC服務高可用。

Motan的架構設計,分為服務提供方(RPC Server)、服務呼叫方(RPC Client)、註冊中心(Registry)三個角色,Server向Registry註冊宣告所提供的服務;Client向Registry訂閱指定服務,與Registry返回的服務列表的Server建立連線,進行RPC服務呼叫;Client通過Registry感知Server的狀態變更。三者的互動關係如圖1所示。

圖片描述

圖1 Motan架構

服務模組化設計方便靈活擴充套件,Motan主要包括register、transport、serialize、protocol、cluster等,各個模組都支援通過SPI進行擴充套件,其互動如圖2。

圖片描述

圖2 模組互動

register模組:用來和註冊中心進行互動,包括註冊服務、訂閱服務、服務變更通知、服務心跳傳送等功能;Server端會在系統初始化時通過register模組註冊服務,Client端在系統初始化時會通過register模組訂閱到具體提供服務的Server列表,當Server列表發生變更時也由register模組通知Client。

protocol模組:用來進行RPC服務的描述和RPC服務的配置管理,這一層還可以新增不同功能filter用來完成統計、併發限制等功能。

serialize模組:將RPC請求中的引數、結果等物件進行序列化與反序列化,即進行物件與位元組流的互相轉換;預設使用對Java更友好的hessian2進行序列化。

transport模組用來進行遠端通訊,預設使用Netty NIO的TCP長連結方式。

cluster模組:Client端使用的模組,cluster是一組可用的Server在邏輯上的封裝,包含若干可以提供RPC服務的Server,實際請求時會根據不同的高可用與負載均衡策略選擇一個可用的Server發起遠端呼叫。

在進行RPC請求時,Client通過代理機制呼叫cluster模組,cluster根據配置的HA和LoadBalance選出一個可用的Server,通過serialize模組把RPC請求轉換為位元組流,然後通過transport模組傳送到Server端。

服務配置化增強了Motan的易用性,Motan框架中將功能模組抽象為四個可配置的元素,分別為:

  1. protocol:服務通訊協議。服務提供方與消費方進行遠端呼叫的協議,預設為Motan協議,使用hessian2進行序列化,Netty作為Endpoint以及使用Motan自定義的協議編碼方式。
  2. registry:註冊中心。服務提供方將服務資訊(包含IP、埠、服務策略等資訊)註冊到註冊中心,服務消費方通過註冊中心發現服務。當服務發生變更,註冊中心負責通知各個消費方。
  3. service:服務提供方服務。使用方將核心業務抽取出來,作為獨立的服務。通過暴露服務並將服務註冊至註冊中心,從而使呼叫方呼叫。
  4. referer:服務消費方對服務的引用,即服務呼叫方。

Motan推薦使用Spring配置RPC服務,目前擴充套件了6個自定義Spring XML標籤:motan:protocol、motan:registry、motan:basicService、motan:service、motan:basicReferer,以及motan:referer。

高可用是Motan的一大特點,支援多種服務治理和高可用機制,包括:靈活多樣的叢集負載均衡策略,支援ActiveWeight/Random/RoundRobin/LocalFirst/Consistent等6種策略,並支援自定義擴充套件;自動整合Failover、Failfast容錯策略,實現故障節點自動摘除,自動探測恢復,有效進行服務故障隔離,遠離服務卡死及雪崩;連線池自定義控制,根據業務場景靈活配置;支援多機房間呼叫流量壓縮、動態流量調整,實現真正的跨IDC的高可用。

基於高併發、高負載場景的優化,具備在高壓力場景下的高可用能力,基準測試情況如下。

Server端,併發多個Client,連線數50、併發數100的場景:

  1. 空包請求:單Server TPS 18W
  2. 1K String請求:單Server TPS 8.4W
  3. 5K String請求:單Server TPS 2W

Client端(場景對比如圖3所示)。

圖片描述

圖3 場景對比

是否重複造輪子

前文提到,當前業界已有一些優秀的RPC框架,微博技術團隊為什麼要再造一個RPC框架呢?也正如上文所述,當前業界可供選擇並持續維護的優秀RPC框架並不多。同時鑑於微博的內部呼叫量非常大,有很多定製化場景,要做到平滑遷移到這些RPC框架也需要做不少定製化改造,最終我們決定自主研發。主要從以下4個方面考慮:

  1. 框架的效能和可用性需要定製化。微博內部呼叫量級非常大,業界很少有類似場景應用經驗可以借鑑,需要針對高併發和複雜邏輯場景定製優化,如Motan的Failover和Failfast機制等。
  2. 儘量做到平滑遷移。線上業務遷移需要保障業務改造儘量少,支援可快速回退,這個必須具備有效的機制保障,如Motan的inJvm機制等。
  3. 未來多語言相容接入訴求。微博整體技術體系包括Java和PHP,還有部分Erlang、C++等,未來希望能通過這套服務框架解決整體內部依賴呼叫問題。
  4. 技術積累儲備及掌控力。微博具有一批實戰經驗豐富的技術專家,有實力又熟悉微博場景。

發展及開源

Motan當前在微博內部已廣泛應用,每天支撐著上億的內部呼叫,這也是個持續改進優化的過程。從服務發現、服務容錯、快速失敗、故障降級等多方面,針對複雜業務架構及高併發場景進行不斷定製優化改進。隨著虛擬化技術的興起,彈性排程成為成熟技術框架不可或缺的能力,新的Motan框架技術負責人也適時對其增加了資料流量壓縮、動態流量調整、多註冊中心支援等功能,讓它能適應時代的變化。

為了方便其他團隊的複用,針對Motan核心功能進行抽離和封裝,去除掉微博自身依賴,形成今天的開源版本,希望能發揮開源社群的力量,進 一步發展和發揮Motan的價值。

期待

在這唯快不破的網際網路時代,軟體的開發速度前所未有。這得益於軟體已有模組的大規模複用。在過去的幾年裡,開源軟體無疑在這方面做出了巨大的貢獻。

微博技術團隊的快速成長,受益於開源社群,同時也希望能為開源社群貢獻自己的力量。Motan是經過大規模實踐的輕量級RPC框架,希望未來 能有更多優秀的開源人進一步完善優化。也期待更多的公司可以享受它帶來的便利。

Q & A

與業界已有的RPC框架,如Dubbo相比,Motan有什麼優勢?

Dubbo功能較豐富,與Dubbo的分層來對比,Motan的模組層次更簡單,沒有exchange和directory等。從壓測的結果來看,在微博的業務場景下Motan的效能比Dubbo要好些。

現在的版本能用於生產環境嗎?

Motan支援了微博的絕大部分底層核心業務,目前看來比較穩定。但是不排除會有一些使用環境不一致造成的問題,建議測試一下再應用到生產環境。

Motan支援跨語言呼叫嗎?

目前暫時只支援Java應用,針對PHPYAR框架的支援已在開發中,未來會支援更多語言。

開源版Motan與微博內部的版本功能一樣嗎?

開源版包含了內部版本中的大部分功能,主要是去除了內部的依賴元件相關的功能。

Motan支援非同步呼叫嗎,如何實現?

請求在傳輸層面為非同步呼叫,不需要額外配置,Motan本身還不支援非同步呼叫。

在使用Motan時遇到了問題,應該去哪裡提問?

訂閱諮詢:

• 線上諮詢(QQ):2251809102
• 電話諮詢:010-64351436
• 更多訊息,歡迎關注“程式設計師編輯部