1. 程式人生 > >阿里雷卷:Reactive 基金會的成立將對開發方式帶來哪些影響?

阿里雷卷:Reactive 基金會的成立將對開發方式帶來哪些影響?

作者 | 趙鈺瑩

近日,Linux 基金會宣佈成立 Reactive 基金會。對於 Reactive,各位開發者應該並不陌生,尤其是 Node.js 開發者,但真正瞭解並意識到這件事情對開發方式帶來的影響的恐怕不多。本文,InfoQ 有幸第一時間對推動阿里巴巴成為該基金會初創成員的阿里巴巴資深技術專家雷捲進行了獨家採訪,進一步全面瞭解 Reactive 基金會的成立背景及其對開發方式的發展推動。

Reactive 基金會是什麼?

近日,Linux 基金會宣佈啟動 Reactive 基金會,旨在加速發展構建下一代網路應用程式的架構。該基金會由阿里巴巴、Facebook、Lightbend、Netifi 和 Pivotal 等初始成員組成。涉及成功的開源規範 Reactive Streams 和 RSocket,以及程式語言實現。


雖然 Reactive 基金會剛剛成立,但 Reactive,也就是開發者常說的響應式程式設計,已經發展多年。2011 年,Reactive 就開始步入大眾視野,當時微軟在 .Net Framework 4.0 中內建了Reactive 支援,稱之為 Reactive Extensions。2013 年,廣大 Java 開發者熟知的 RxJava 釋出。接下來,Reactive 進入飛速發展階段,先後出現了 RxRuby、RxJS(感興趣的開發者可以訪問 http://reactivex.io/  )等。


在技術的發展過程中,各大廠商也開始陸續跟進,比如 Reactive 宣言、Lightbend 的 Akka、Spring 的 Reactor 專案,Spring Reactive Web 等,新興的微服務框架基本都是 Reactive 的,比如 Vert.x,Micronaut 等。 很多開發者對 Reactive 的理解是開發包,比如 Android 中整合 RxJava、Spring 中的 Reactive Web。但是,RSocket 的出現將 Reactive 擴充套件到分散式場景,讓所有應用都可通過 Reactive 和 RSocket 的方式串聯起來。


至於為什麼 Reactive 可以迅速被廣大開發者接受,比較典型的兩大價值如下:

  • 非阻塞和高併發: Reactive 基於非同步訊息通訊,與 Node.js 的 Event Loop 設計類似,這樣的應用沒有同步阻塞,系統吞吐率較高,相當於提升了系統性能。之前,開發者採用執行緒池來實現併發,現在通過 Actor 的訊息模型,消除了獲取執行緒的等待,減少了大量執行緒的切換,CPU 利用率提升。此外,非阻塞和高併發對雲上客戶尤為重要,CPU 利用率和 QPS 提升直接意味著賬單金額變少;
  • 函數語言程式設計正規化: 函式程式設計已經越來越被開發者接受,擁有執行緒安全、高效執行等優點,但是將這些函式串聯起來工作,需要一定正規化和相關框架,這就是 Reactive 做的事情,比如標準的 Reactive Streams 規範,相關的開發框架 RxJava、Reactor 等,可讓函式程式設計更加簡單,而且程式碼還是統一風格,閱讀簡單的同時,Code Review 也非常容易。這就好比 Java 中有 Servlet 規範,眾多 Web 框架來簡化 Web 應用開發一樣。如果在程式碼中看到 filter、 map、flatMap、subscribe 等函式呼叫,基本就是 Reactive 的雛形。


Reactive 基金會的出現則無疑會將這一技術的價值在未來最大化。據雷卷透露,整件事情在 2018 年底就已啟動。當時,阿里巴巴與 Netifi、Pivotal 和 FaceBook 在共同開發 RSocket 相關開源產品。雖然,Reactive 這個詞經常被提及,但是知道的開發者還是比較少,幾家公司覺得需要讓更多開發者知道這項技術,因此有了成立基金會的想法。雷卷表示:

整個籌備過程花費了不到半年的時間,主要得力於 Netifi 和 Pivotal 的支援,雖然很多人還不是特別瞭解 Reactive,但是 Linux Foundation 的很多人對技術方向的把握還是很到位的,所以在半年不到的時間就完成了 Reactive 基金會的建立。


大部分開發人員對這幾家初創成員公司都不陌生,比如微服務領域比較火的 Spring Framework 就是 Pivotal 在維護開發。之後,這幾家公司將共同參與到基金會的工作中,雷卷表示,Pivotal 主要致力於將 RSocket 與 Spring 生態進行融合;Netifi 是 RSocket SDK 核心開發團隊,同時有自己的 RSocket Broker 商業產品;Facebook 也致力於 RSocket 的開發,其中,RSocket-cpp 和 RSocket-js 主要都是 Facebook 的工程師在維護,同時,Facebook 內部也在積極推動 RSocket 落地;Lightbend 可能很多開發者覺得陌生,但它是 Scala 語言背後的支援公司,同時也是響應式程式設計的先行者,支援著 Akka 平臺的開發;阿里巴巴主要集中於 RSocket 的開發,基於 Reactive 和 RSocket 將分散式開發推向下一個高度,同時也在積極開發內部的 RSocket 產品,該產品將為雲上客戶提供服務。


Reactive 基金會成立的出發點就是推動 Reactive Streams 和 RSocket 的發展,這對後續的 Reactive 產品開發有非常大的指導意義,保證了這些 Reactive 產品在 API 和協議上都是相容的,這對最終開發者而言非常重要。


具體來說,Reactive 基金會將首先推動 RSocket 1.0 規範的落地,包括各種語言的 SDK 開發,這是一件工作量大且繁瑣的工作,各種語言、測試、效能等相應工作都需要配合進行。對開發者來說,Reactive 基金會將帶來很多價值,比如持續推動規範演進、SDK 開發、文件、會議支援等,同時也是各 Reactive 產品對開發者的介紹視窗。

Reactive 對開發方式帶來的改變?


事實上,Reactive 的出現對現有架構帶來許多衝擊,比如基於事件驅動設計、流式處理、Service Mesh、無網路依賴、安全等。相應的,開發方式也會隨之發生改變,越來越多的框架開始全面支援 Reactive,比如 Spring WebFlux、Spring Data Reactive Repository 等;資料庫操作,通過 R2DDBC 方式已經完全 Reactive 化;各種 NoSQL 產品,比如 Redis、MongoDB 等,早已支援 Reactive;RPC 和 HTTP REST API 在 RSocket 的影響下可能也會改變開發者對分散式通訊的認識。在這些改變和衝擊中,最典型的就是程式碼編寫和分散式通訊。

  • 程式碼編寫: 我們之前過程式的程式碼,將會被函數語言程式設計和 Reactive 正規化替代,之前程式碼中大量的 if else, null 判斷,for 迴圈,try/catch 等,都會極大地減少,取而代之是 Reactive 的各種標準操作,更加簡單明瞭,程式碼量也會顯著減少。
  • 分散式通訊:之前分散式開發,我們非常注重通訊細節和併發的處理,這個是核心,Reactive 和 RSocket 的介入,會讓開發門檻會降到最低,你幾乎不用關心通訊的底層細節、併發執行緒數處理、斷路保護等,這一切 Reactive 下的 RSocket 就給你解決啦,你可能只用關係介面設計和資料序列化。現在的應用越來越追求極致效能,CPU、GPU 和 FPGA 等全都上,如果沒有匹配的高效通訊協議,那麼效能會打折不少,而這一切 RSocket 都可以幫你做到,而且更加簡單和優雅,我們稍後也會介紹 RSocket。


可以說,即便開發者現階段不關注 Reactive,這一暗潮也已經在湧動。與此同時,業界也存在很多 Reactive 和 Java 整合的一些技術,這些技術讓 Reactive 更加成熟且穩定:

  • Reactive 框架: RxJava, Reactor, Akka, Kotlin Coroutines & Flow
  • Web 框架: Spring WebFlux, Vert.x, Micronaut, Helidon
  • 資料層: Spring Data Reactive,支援 database, Redis, Cassandra, MongoDB 等等
  • 通訊層: RSocket, Reactor Netty, Reactor Aeron,Reactive Dubbo
  • 整合:  Reactor Kafka, Reactor RabbitMQ,RocketMQ 等


如今,越來越多的開發者開始習慣基於雲平臺開發應用。如上文所言,Reactive 的發展對雲原生領域的發展也將起到很大作用。在採訪中,雷卷透露,雲原生可讓應用獨立於底層架構,保持中立,進而可執行在不同雲廠商的底層架構上。 但是,這一方式並沒有解決應用之間如何進行通訊的問題,雖然有基於 API 的協作,但是並沒有對 API 做出具體要求,尤其是基於訊息的非同步通訊。


目前最常見的應用間通訊就是 RPC 和 HTTP REST API。這兩者對於 request/response 的通訊完全沒有問題,HTTP REST API 只是有一些效能問題,但是整體還好。不過,這些技術也都在向 Reactive 靠攏,比如 Spring 的 RestTemplate 轉向 WebClient,而 gRPC 也有對應的 Reactive gRPC 等。對於新的架構設計,比如 Streaming、Event Driven、IoT 和雙向通訊,傳統的 RPC 就有點力不從心,而這些正是 RSocket 所擅長的。


RSocket 協議經過非常長時間的論證,當然也借鑑了其他協議的思想,終於形成了目前開發者看到的 1.0.0 版本。RSocket 協議可以說是目前基於二進位制非同步訊息通訊比較完美的版本,克服了之前協議設計中的一些問題,比如 Client/Server 轉換到角色對等的方式;Pub/Sub 調整為更靈活的 Request/Stream;元資料和資料分離的方式,提供更靈活的訊息路由和訊息編碼;傳輸層可插拔,支援 TCP、WebSocket、UDP/Aeron、RDMA 等;同時支援多語言接入,比如 Java、Kotlin、Node、C++、Golang、Python、Rust 等。


目前,RSocket 已經受到廣泛支援,Spring Framework 將在 5.2 版本內建 RSocket,Spring Boot 2.2.0 版本也第一位支援 RSocket,其他 Spring Cloud Gateway,Spring Security 等都會支援 RSocket。正如 Linux 基金會戰略副總裁 Michael Dolan 所言,Reactive 基於訊息驅動的方式可以保證雲原生應用所需的彈性,可伸縮性和響應能力,而且這一切都不受其底層基礎架構的影響。換言之,利用 Reactive 的特性,開發者不需要依賴雲廠商或者 Infra 層就可以達到 Reactive 宣言所說的彈性、可伸縮性和響應能力。可以說,雲原生關注應用的外在,比如打包部署、執行環境、監控等,而 Reactive 更關注應用內在,比如程式碼執行的更有效率,應用間通訊更加自然流暢,一定的彈性和自我恢復能力等。

阿里巴巴 Reactive 實踐及開源計劃


作為 Reactive 基金會的初創成員之一,阿里巴巴一直給外界的印象都是內部使用了大量 Java 程式語言,積累了大量的 Java 技術棧。但是,據雷卷透露,阿里巴巴內部的一些產品很早就開始進行 Reactive 化,比如開發者都瞭解的 Dubbo,就在做 Reactive 和 RSocket 的整合。但是,Reactive 化的過程還有很多問題需要解決,比如 SDK 的 BUG,適配內部各種架構體系。雷卷認為,最大的問題就是如何將阻塞調整為非阻塞方式,比如資料庫操作,非非同步的 RPC 呼叫。


作為基金會的一員,阿里巴巴會將內部 Reactive 化的經驗共享給需要的開發者,主要貢獻將偏向於 RSocket,主要是分散式 Reactive 與雲上的整合,因為阿里巴巴在安全、效能測試、SDK 開發上面都貢獻了非常多,同時結合雲上的特點以及多租戶支援,讓雲上使用者使用更簡單。  在內部,阿里巴巴也積極推動產品 Reactive 化,新增對 RSocket 支援等。


在技術革新的同時,阿里巴巴還在著力解決成本問題,如果開發者聽過 QCon 2019 北京大會上的 RSocket 演講,可能會對 Netifi 公司通過研發 RSocket 幫助企業實現微服務,在 40,000RPS 的場景下,Istio 需要每月 3495 美金,而 Netifi 每月只要 388 美金,同時效能提升 10 倍有印象,這對任何企業無疑都極具吸引力。從那次演講到現在已有半年之久,新推出的 RSocket Broker 已經支援多租戶特性,而非獨佔的方式,成本可再次降低 50% 到 70%,在 4 萬 RPS 場景下,每月只要支付 200 美元不到。


雖然阿里巴巴的 Reactive 程序還在進行中,但其帶來的成本價值已經有所體現。雷卷表示,主要是同步轉非同步後,應用的總體效能提升,直接變化就是費用花銷變少,這對其他使用者而言應該也是一樣的。

結束語


對 Node.js 開發者來說,如今幾乎都是 Reactive,而對 Java 開發者來說,尤其是後端,目前還處於早期階段,目前遇到最大的問題是,Reactive 要求使用者調整程式碼,這是最大的麻煩,開發者需要很長時間熟悉、瞭解和使用。而且相關整合還不完善,雖然 Spring 5.0 已經包含 Reactive,但並不是所有都支援。雷卷表示,Spring 5.2 將從底層全面支援 Reactive,一旦該版本正式釋出,開發者就可以體會到 Reactive 和 RSocket 開發的便捷性。


在開源方面,阿里巴巴正在研發 RSocket Broker 產品,希望可以很快推出,讓更多開發者能夠更好地使用 Reactive,幫助雲原生應用解決非同步通訊問題,讓所有組織和開發者可以更簡單、高效、安全,同時極大降低成本。


作者介紹:
雷卷,阿里巴巴資深技術專家,目前就職於阿里巴巴矽谷辦公室。在阿里巴巴工作 10 餘年,具備 20 年 Java 開發經驗,參加過多個內部專案,從物流、旺鋪到國際部中介軟體等。目前主要的研究方式是 Reactive 和 RSocket,將 Reactive 和 RSocket 帶到應用開發中,構建更加簡單高效的架構設計。雷卷同時也是 RSocket 的開發者,主要著重於 RSocket Broker 的開發