上一篇提到微服務的興起是RSocket
誕生的重要契機,相信有微服務開發經驗的朋友,在微服務切分耦合與實際上的效能問題如何抉擇傷透腦筋,服務間的溝通效率不彰是微服務一大痛點,HTTP協議本身是為了服務與客戶端之間的溝通而誕生,這篇就來探討RSocket
與其他協定的差別。
我們最熟悉的Http協定,OSI
第7層,最初是用來發布或接收Html頁面的方法,定義客戶端與服務端之間的request/response的標準。
建立連線需要成本,1.1提供Connection: keep-alive
來幫助持續連接,減少建立與關閉連線的時間延遲。且不需要等待上一次的結果就可以發送下一個請求。並定義了現在常見的GET
、POST
、PUT
...八種Http Medthod。
在效能方便進一步的加強,增加了伺服器推送功能、壓縮HEAD
增加傳輸速度、將多個請求合併在一個TCP
(Multiplexing
)而不是單獨占用一條TCP connection
、改用二進位而非原本的文本格式......等等大幅的增加網頁的載入速度。
聽到RSocket
的時候我其實第一個想到就是websocket
,與Http相同是OSI第7層,有別於單向短連接的http協定,websocket
提供一個成本較低服務與客戶端互動長連接的方式,相對於http當時可能需要透過Polling
輪詢的方式才能辦到,而且又效能低下。
建立於HTTP/2之上,為了適用於服務之間多語言的溝通,內文是透過Protobuf
一種有效率的二進位訊息格式來傳輸,相對於原本的HTTP提高了效率。相對於常用的RESTful
可以更充分的運用HTTP/2的優點。對於長連線與雙向的溝通都有支援。
flow control
),Reactive Streams
request(n) Async Pull & Leasing
(註1)RSocket
有四種,更能應對不同的使用場景。WebSocket
只是一個框架,RSocket
更完整。gRPC
為OSI第7層,RSocket
是第5/6層。gRPC
有自己特定的payload
,RSocket
沒有特別指定。gRPC
建立於HTTP/2之上只適用HTTP/2的情境,RSocket
可以是TCP、檔案或是WebSockets。gRP
沒有獲得所有的瀏覽器支援,需要額外的程式碼,RSocket
只需要接受WebSockets
連線就可以暢行各瀏覽器。Reactive Streams
request(n) Async Pull :就是基於我們之前介紹過的Reactive Streams
透過Subscription.request(n)
來建立訂閱者與發佈者之間的溝通,具體會由Reactor
、RxJava
或是Akka Streams
來實作,可以在應用層去控制資料傳送的速率而不單單靠網路緩衝,適用於服務與服務或是服務與裝置之間。Leasing
:適用於服務與服務之間,server端要評估自己能負荷的空間給client端達到控制速率的效果,也就是client端可以使用特定邏輯的負載平衡演算法(load-balancing algorithms)來選擇最佳的server端,範例推薦閱讀簡書。其實提高效能還有一個顯著的優點,就是可以降低硬體的成本,主管看到雲端服務的帳單比較不會吐血。