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

IEC 61851標(biāo)準(zhǔn)中的四種EV充電模式

GPIO的四種輸入模式介紹

淺析電子負(fù)載常見的的四種工作模式
介紹MCUboot支持的四種升級模式(2)

變頻器主要支持哪四種模式?有什么區(qū)別?

評論