天天看點

想開發IM叢集?先搞懂什麼是RPC!

即時通訊網官方技術群和社群裡,經常有開發者在糾結怎麼開發IM叢集,雖然真正的使用人數,可能用個人電腦單機都能支撐。

想開發IM叢集?先搞懂什麼是RPC!

你也許會說,明明不需要用到IM叢集,幹嗎要自找麻煩?答曰:“老闆說這個得有!”、“萬一産品做成了,使用者量達到百萬、千萬級呢?”,各種回答,反此種種。總之,IM叢集就是得整一個(先甭管用不用的上...)。

當然,玩笑歸玩笑,真正要做到可投入到生産級别的IM叢集系統,難度還是相當大的。必竟IM這種長連接配接應用相比傳統Http這種短連接配接應用太不标準。

我們以一個典型的IM聊天消息傳輸為例:

假設存在兩個正在聊天的使用者(使用者A和使用者B),當A連接配接的是IM叢集中的IM執行個體1、B連接配接的是IM叢集中的IM執行個體2,此時當使用者A向使用者B發送一條聊天消息時,這條消息應該如何傳遞呢?

我們梳理一下上面這個例子的消息流轉過程:

1)IM聊天消息首先會由使用者A發往IM執行個體1;2)IM執行個體1會将此條消息轉交給IM執行個體2;3)IM執行個體2會将此條消息最終投遞給連接配接在本執行個體上的使用者B。

如上述流程所示,這就是一個IM叢集系統中典型的聊天消息投遞過程。

想開發IM叢集?先搞懂什麼是RPC!

那麼,這其中涉及到一個關鍵步驟:即第2)步中如何實作“IM執行個體1會将此條消息轉交給IM執行個體2”?

此時,RPC技術出場了!

RPC 是1984年代由 Andrew D. Birrell & Bruce Jay Nelson 提出的(見二位大佬的論文《Implementing Remote Procedure Calls》),是以它并不是最近才有的技術概念。

關于RPC的介紹,正經的資料上大概是這樣介紹的:

RPC(Remote Procedure Call)遠端過程調用,它是一種通過網絡從遠端計算機程式上請求服務,而不需要了解底層網絡技術的協定。也就是說兩台伺服器A,B,一個應用部署在A伺服器上,想要調用B伺服器上應用提供的方法,由于不在一個記憶體空間,不能直接調用,需要通過網絡來表達調用的語義和傳達調用的資料。即時通訊聊天軟體app開發可以加小藍豆的v:weikeyun24咨詢

大白話了解RPC就是:RPC讓你用别人家的東西就像自己家的一樣。

看得我似懂非懂,于是我不得不問幾個問題:

1)為啥要用别人家的東西——請求其他服務);2)我怎麼可以借到别人家的東西——其他服務調用;3)要是借用的話哪種形式更好——确定一個合适的調用方法);4)怎麼讓我用别人東西像自己的一樣——屏蔽底層細節透明通信)。

在解答這些問題之前,我們必須達到一個共識問題:RPC隻是一種通信模式,和http并不沖突對立,相反http可以作為RPC傳輸資料的一種協定,把RPC當作一種模式和思想,我們才能更好地了解它。

以大家最熟悉的電商系統為例,這樣規模的分布式系統,需要拆分出使用者服務、商品服務、優惠券服務、支付服務、訂單服務、物流服務、售後服務等等。這些服務之間都互相調用,這時内部調用最好使用 RPC ,同時每個服務都可以獨立部署,獨立上線。

也就說當我們的項目太大,需要解耦服務,擴充性強、部署靈活,這時就要用到 RPC ,這主要是解決了分布式系統中,服務與服務之間的調用問題。

在日常業務中我們可以把功能封裝成靜态庫、動态庫、sdk、獨立服務等,最常見也最友善的還是HTTP這種形式的調用。

HTTP服務把需要提供的服務暴露成接口(也就是通常所說的http rest接口啦),使用方直接按約定的HTTP方法和URI進行資料互動。

我們都知道HTTP協定是應用層協定,是個非常标準的協定,在HTTP協定之下還有網絡層、傳輸層、資料鍊路層等,一個資料包packet除了淨荷payload之外還有很多header,由于标準和通用性的設計目标也使得HTTP一次資料互動真正傳輸的payload隻是其中一部分。

HTTP是我們用的最多最熟悉的互動模式,在系統内部各個服務之間接口較少,互動不多的情況下工作得還不錯。

但如果在内部系統調用很複雜的前提下,HTTP調用的效率和安全性就不那麼理想了。

以IM系統為例,單個IM執行個體的吞吐效率至少可以達到幾萬甚至數十萬QPS,使用HTTP這種短連接配接(調用時建立socket連接配接,完成後釋放連接配接)方式顯的相當低效(每次調用都要重新經曆TCP的3次握手、4次揮手過程),在分布式的情況下勢必拉低整個IM叢集的吞吐效率。而對于RPC,這種socket長連接配接方式對于高性能場景來說,效果是顯而易見的。

更重要的是面對衆多的服務我們需要的不僅僅是一個通信方式,而是一個内部服務的管理系統,這也就是我們今天說的RPC架構。注意:RPC是一種模式政策和架構,并不是單純的通信協定。

題外話:實際上,HTTP在RPC系統中,并不是個你死我活的關系,必竟HTTP隻是個通信協定,而HTTP有某些性能要求不敏感的場景來說,是完全可以作為RPC的具體實作協定之一來使用的。