Categories
程式開發

專訪阿里雷卷:為什麼 Reactive 會突然受到了關注?


從SOA到微服務架構,再到中台,服務的粒度越來越小,服務的數量越來越多。於是,一直不溫不火的 Reactive 再次走入了人們的視線,服務之間的通訊也成為了大家關注的焦點。在 ArchSummit 全球架構師峰會(北京站)的現場,InfoQ 採訪到了Reactive 基金會的初創成員、 RSocket 開發者陳立兵(花名雷卷),聽他分享Reactive和服務通訊協議的最新發展。

專訪阿里雷卷:為什麼 Reactive 會突然受到了關注? 1

Reactive 基金會的初創成員、 RSocket 開發者陳立兵(花名雷卷)

Reactive為何突然翻紅?

Reactive 不是一個新事物,在其發展歷程中,有幾個比較關鍵的節點:

  • 2011年6月,微軟推出的 .Net 3.5內置了Reactive Extensions特性;

  • 2013年2月,RxJava 0.1版本發布;

  • 2014年9月,Reactive Manifesto 發表;

  • 2015年2月,Reactive Streams 出現;

  • 2018年6月,RxJava 2.X 版本和Reactor 3.X版本發布;

  • 2019年9月,Reactive Foundation 成立;

為什麼在當前這個時間節點,Reactive 會突然翻紅呢?雷卷認為這與新技術的發展是密切相關的,同時他也點名了三種與Reactive 發展相關的三種技術,微服務、雲計算和DDD

Reactive 與 微服務

隨著業務的快速發展、業務複雜度越來越高,傳統單體應用逐漸暴露出了一些問題,例如開發效率低、可維護性差、架構擴展性差、部署不靈活、健壯性差等等。而微服務架構是將單個服務拆分成一系列小服務,且這些小服務都擁有獨立的進程,彼此獨立,很好地解決了傳統單體應用的上述問題,因此受到了業內的重視和推崇。

但是落地微服務架構就必須解決服務之間的通訊問題。傳統的通訊方式是RPC調用,但是服務與服務之間通訊不只有RPC,有些服務可能負責消費數據,有些可能負責數據採集或生成,有時服務之間的通訊是相互且對等的,服務的角色在分工細化之後,就需要一個更全面的通訊協議。

Reactive 與 雲計算

我們常說:“現在大家討論的已經不再是要不要上雲的問題,而是上哪朵雲、怎麼上的問題了。”企業上雲已經是大勢所趨,但是上雲之後,大家首先會關心的就是成本問題。

上雲之前,企業一般是在年初的時候就做好一年的規劃,購買足夠多的機器,所以對於機器的利用率不是特別關心,只要保證不超出預算就可以。但是上雲之後,機器利用率的高低直接關乎著每個月的IT費用,所以大家都想著利用率能不能高點、再高點,費用能不能省點,再省點。

而異步就是提昇機器利用率最好的方法之一,因此云計算的發展也推動了Reactive的發展。

Reactive 與 DDD

領域驅動設計(DDD)是一個開放的軟件設計方法論,從Eric Evans出版《領域驅動設計》之後,DDD一直是業內推崇的設計方法學,其劃分服務的Bounded Context理念已經被微服務設計所接受。但是在各個Context之間如何通訊,DDD推薦的做法是基於消息/事件的理念,但是具體使用什麼樣的技術、什麼樣的協議等等,這些都沒有明確,可以說是一個寬泛的概念。

2014年,Dean Wampler提出:“DDD是針對設計誕生的,關於實現使用了更多抽象概念,也就是沒有明確如何實現,也許DDD以一種非OOP方式也許更好,Reactive方式很合適DDD實現。 ”

DDD + Reactive的結合,就很好地解決了Context之間如何相互通訊的問題,將抽象的概念能夠以非常直觀方式進行實現,這個也是DDD倡導的從問題域到實現域一整套解決思路。

RSocket是什麼?

新技術的發展使得異步化、協程、Reactive等重新走紅,但是在具體微服務應用落地過程中,大家發現會遇到一個很大的難題,服務與服務之間的通訊變得非常複雜,而目前並沒有一個功能全面的標準協議,大家都是在做各種協議的適配和組合。

於是,RSocket 應運而生了。 RSocket是一個二進制的異步消息通訊協議,由Facebook、Netifi和Pivotal等工程師聯合開發,基於Reactive Streams規範具有異步、背壓支持、多路復用、基於消息通訊、可擴展等特性,同時提供了Java 、JavaScript、Python、C ++、Golang、Rust各種語言SDK實現,方便應用快速接入RSocket協議。

為什麼需要RSocket?

很多人都會好奇為什麼我們會需要一個新的通訊協議? “原因很簡單,因為原來的通訊協議功能不夠豐富和高效。” 雷卷表示:“現有的通訊協議基本都是解決特定領域的問題,並不能囊括所有通訊方式。”

目前最常見的應用間通訊協議是 RPC 和 HTTP REST API。這兩者對於 request/response 的通訊完全沒有問題,但是針對新的架構設計,比如 Streaming、Event Driven、IoT 和雙向通訊,就有點力不從心。

而RSocket 通訊協議可以覆蓋四種通訊方式,而這四種方式幾乎覆蓋了所有的通訊模式。

  • Request/Response模型:通俗來說,就是發出去一個請求,就必須等到一個響應,是目前使用比較廣泛的通訊模型;

  • Request/Stream模型: 通俗來說,就是單個請求可以接收多個響應,常見的使用場景包括獲取視頻列表、獲取目錄中的產品等等。

  • Fire-and-Forget 模型:通俗來說,就是單向請求,不接收響應,發出去就不要了。

  • Channel(Bi-direction)模型:提供雙向通信,信息流在兩個方向上異步流動。通俗來說,就是可以發出多個請求,並接收多個響應。

“RSocket 協議從根本上解決各種通訊問題,適配了新的技術發展。”雷卷表示:“以前的通訊協議能解決特定領域的問題就可以了,是很薄的一層。而實際的通訊是複雜的,一個設計很好的協議,可以從根本上滿足不同應用之間通訊需求,解決應用之間互聯互通的問題,而不是當前各種協議相互轉換和適配,增加架構的複雜度。”

多語言支持

除了架構、性能等問題,開發語言支持也是開發者很關心的問題。據雷卷介紹,目前RSocket支持的編程語言包括 Java(Kotlin)、 Javascript(Browser & Node)、 C++、Python、Golang、.Net、Ruby、Rust等,同時 Dart、Swift 的支持也在規劃和開發當中了。

Reactive的目的之一就是支持異步化,而不少語言都包括了對異步化的支持,另外不同的編程語言有不同的特性,那麼如何讓RSocket在各個語言SDK實現更符合該語言的開發習慣呢?雷卷表示:“在做SDK的時候,我們堅持的一個原則是Language-Native,即一種編程語言的SDK必須要符合該種編程語言的習慣和規範。例如,Go語言SDK會使用goroutinue、Python SDK中會使用asyncio。”

總的來說,RSocket在開發SDK時通常會有兩個:一個是Reactive的API,一個是Language  Native的API,開發者可以根據自己的開發習慣選擇對應的API。

RSocket落地產品

前面講的這麼熱鬧,有沒有已經落地的RSocket產品呢?實話說,目前落地的產品很少,雖然Spring Framework內置了對RSocket的支持,但目前商業產品也就只有Netifi Broker。不過,阿里巴巴剛剛開源了一款基於RSocket 協議的中間件產品——Alibaba RSocket Broker。

專訪阿里雷卷:為什麼 Reactive 會突然受到了關注? 2

Alibaba RSocket Broker 架構圖

RSocket Broker的主要作用是橋接應用通訊的雙方。

當應用啟動後,會與Broker創建一個長連接,並同時表明自己的身份,如果是服務提供者,需要提交發布的服務信息, Broker會針對所有的連接和服務列表建立對應的映射關係。

當一個應用需要調用其他服務時,應用會將請求以消息的方式發給Broker,然後Broker會解析消息的元信息,然後根據路由表將請求轉發給服務提供者,然後將處理結果後的消息再轉發給調用方。

由於Broker是完全異步化的,且消息轉發是基於Zero Copy,所以性能非常高,無需擔心中心化Broker會成為性能瓶頸,我們稱之為軟路由的設計策略。

RSocket Broker 解決了哪些問題呢?具體來說,它解決了傳統設計中的常見的以下問題:

  • 配置推送: 通過RSocket的metadataPush可以完成應用配置推送;

  • 服務註冊和發現:應用和Broker建立連接後,這個長連接就是服務註冊和發現,不需要額外的服務註冊中心;

  • 透明路由: 應用在調用服務時,不需要知道服務對應的應用信息, Broker會完成路由;

  • Service-to-service調用: RSocket支持服務之間通訊的4個模型;

  • 負載均衡(Load balance): 應用和Broker建立長連接後,基於長連接的負載均衡就會變得非常簡單;

  • Circuit Breakers: 斷路保護,現在調整為被壓(Back Pressure)支持,服務保護策略更自然;

  • 分佈式消息(Distributed messaging)通訊: RSocket通訊策略本來就是基於消息的;

Alibaba RSocket Broker 開源地址:https://github.com/alibaba/alibaba-rsocket-broker 歡迎大家試用並提出寶貴意見。