RSocket的定義
RSocket 是Reactive Socket的意思,也就是反應式編程的網絡協議。
它的官方 文檔 的標語是:
Application protocol providing Reactive Streams semantics
這里有幾層意思:
- 首先RSocket確保的是網絡通訊的語義是符合反應流的規范。
- 第二它是應用層的協議,所以它并不介意傳輸層的協議。
接著,文檔中給出了它的具體定義:
RSocket is a binary protocol for use on byte stream transports such as TCP, WebSockets, and Aeron.
這里強調的是RSocket協議是二進制的編碼,與文本編碼有很大的不同。
2 設計的思想
隨著微服務的發展,傳統的反應式編程的實現也受到挑戰,特別在網絡傳輸的部分,需要把背壓作端到端的傳輸,而不是在一跳以后就丟失了。
另一方面,反應式編程的本身就要求反應式編程是消息驅動的。
這兩個方向的方向的合力,就是把反應式編程從CPU和內存延伸到網絡,這就是RSocket。這里的網絡,是指應用層的,RSocket 努力的方向是讓應用的語義可以在網絡上傳播。而對于傳輸層,RSocket 的原則是盡量兼容。目前它支持的傳輸層有WebSockets, TCP, 或者 Aeron。
3 RSocket 的四種通訊模式**
RSocket 先定義了一套規范,然后才有實現。這套規范定義了數據幀的格式。此外,RSocket 總結了分布式應用的通訊共同特點,定義了四種不同的反應流通訊方式。
- request/response (stream of 1):就是傳統的RPC
- request/stream (finite stream of many):是指單向的流
- fire-and-forget (no response):是指無返回值的RPC
- channel (bi-directional streams):是指雙向的流
4 與反應式編程的關系**
反應式編程的兩個主要方面(非官方解釋),就是非阻塞線程管理和背壓。RSocket 主要是實現背壓的網絡部分。有的語言,如Java, 有好幾個反應式編程的庫,如RxJava, Reactor等。這種情況下,RSocket 就是和這些已有的庫整合,不會重新發明輪子。但是,如果有的語言沒有這樣的庫,那么RSocket 就要自己實現這部分的功能。
一個完整的RSocket SDK, 是包括非阻塞線程管理+背壓+網絡的,應該把它當作是反應式編程的擴展,而不是一個單獨的模塊。沒有了其他的部分,RSocket 是根本沒有用的。
5 與gRPC的比較**
gRPC 也分兩部分(非官方版本):protobuf 和 HTTP/2。與HTTP2的比較下一節講。Protobuf 要解決的問題,是多語言定義服務的問題。這個和RSocket 要解決的問題不是一個方向的。所以,RSocket 可以支持protobuf 的IDL。在負載編碼的問題上,RSocket 很中立,它支持protobuf,Json, 或者是Java interface。
6 與HTTP/2的比較
HTTP/2 是1.1的增強版,但它還是HTTP。這個協議有幾個比較大的問題:
- 它是為 web 通訊開發的, 它的主要特點是通信的單向性。對一個鏈接來說,一定有一個 client, 一個server。而RSocket 是針對應用間的通訊而設計的,通訊像對話一樣,是雙向的,是流式的。所謂client和server的關系也是比較模糊的。HTTP/2著名的server push是為瀏覽器開發的。對應用而言,要么是用websocket, 要么是用SSE,即ascii編碼。
- HTTP/2所支持的語義是基于HTTP 方法,GET, PUT, DELETE,等。這些對于應用來說是不夠的。而額外操作的定義就要在應用中自行完成。
- HTTP/2的流控是在字節的層級上,而不是應用的層級(幀)。這樣的轉化也會增加應用的負擔。
7 RSocket 自身的特點
我們暫時忘掉反應式編程。不管叫什么名字,它最終要為應用帶來好處。我們就RSocket 為應用帶來的好處做個介紹:
- 面向鏈接。這個特點以后我們會展開講。簡單說就是鏈接的狀態會被保存下來。當然,與kafka等不同,這個狀態不落盤。但是只要有一邊不重啟,鏈接狀態是可以恢復的。
- 雙向傳輸。就是復用同一個鏈接,雙方沒有主次之分。一旦鏈接建立,雙方都可以用背壓方式要求數據傳輸。
- 端到端的流控。這條以后也會展開說。簡單地說,HTTP/2 的流控是一站一站,就是說假設A-B-C,A-B的流控對B-C是無效的。而用了RSocket,A-C的流控是應用程序可控的。比如A說給我8條記錄,(這就是背壓的實現),C就會知道并傳8條記錄到A。
這些特點,會讓RSocket 在應用間的通訊表現比起HTTP/2有很大的提升。
本文作者:Andy Shi,阿里巴巴高級技術專家,Andy長期關注Service Mesh,在Cloud Foundry,Kubernetes,Envoy,RSocket上有著豐富的實踐和開發經驗。
-
cpu
+關注
關注
68文章
10877瀏覽量
212128 -
TCP
+關注
關注
8文章
1370瀏覽量
79135 -
網絡通訊
+關注
關注
0文章
74瀏覽量
11272
發布評論請先 登錄
相關推薦
評論