RSocket——Http協議的替代者
- 2019 年 12 月 5 日
- 筆記
1. 簡介
RSocket是一種二進位的點對點通訊協議,是一種新的網路通訊第七層協議。旨在用於分散式應用程式中。從這個意義上講,RSocket是HTTP等其他協議的替代方案。它是一種基於Reactive Streams規範具有非同步,背壓的雙向,多路復用,斷線重連,基於消息等特性。它由Facebook,Netifi和Pivotal等工程師開發,提供Java,JavaScript,C ++和Kotlin等實現。
2. 背景
說到這裡就有一些疑問了,為什麼要搞這個協議?難道程式設計師吃飽了撐得搞點新東西折騰自己?上面提到了Reactive Streams規範。這是java領域新的響應式規範,Reactor 3 、RxJava 都是該規範的實現。webflux、hystrix 總聽說過吧。java 9 也吸收了該規範的一些精華。也就是說我們現在可以實現網路通訊上的響應式了。響應式一個重要的特性就是背壓(backpressure)。http通訊中服務端接收到過多的請求很容易會過載,嚴重時導致宕機。而通過背壓處理可以選擇性的響應請求來避免這種情況。還有http協議是無狀態的,只要有請求不管是有效的還是無效的,是否是重複的,伺服器都會進行處理直到完成。如果使用響應式一定程度會大大減少這些無意義的請求。有時候我們需要建立起長連接。就需要藉助於Websocket來實現。如果使用RSocket就很容易建立連接雙方的管道。還有其它非常多的場景這裡不再一一列舉。
3. 特性
其實上面也說明了一些RSocket的特性。這裡簡單總結一下:
- 具有語言無關性的二進位通訊協議
- 非同步非阻塞消息驅動通訊,高性能
- 實現了網路通訊的背壓處理,在此基礎上進行流量控制、連接恢復
- 天然支援雙向通訊
- 更加適合分散式通訊場景
4. RSocket四種交互模型
RSocket定義了四種交互模型來彌補Http協議的不足之處:
- Fire-and-Forget:優化請求/響應,在不需要響應時非常有用,例如非關鍵事件日誌記錄。
- Request/Response:類似Http的請求/響應模型 但是具有Http沒有的優點,它是非同步和多路復用的。
- Request/Stream:單個請求可以接收多個響應。例如獲取影片列表、獲取目錄中的產品
- Channel: 該模型模型提供雙向通訊。在此模型中,消息流在兩個方向上非同步流動。例如發生更改時,從伺服器向客戶端發出增量/差異
5. 前景
隨著響應式越來越被提及,RSocket在網路通訊的前途是不可限量的。有眾多諸如Facebook、Pivotal等一線大廠的背書。Spring framework最近的幾次更新都特別對其進行了支援。知名rpc框架Dubbo從3開始也針對RSocket進行了適配。目前RSocket還處於候選版本,還沒有正式版。相對資料較少。而且需要對Reactive Streams 規範熟悉。相對來說目前學習曲線還是比較陡峭的。不過我們或許可以從中借鑒一些解決問題的思路。

