Quarkus 如何結合命令式和反應式編程

今年我們計劃認真開發容器主題, 雲端原生Java и Kubernetes。 這些主題的邏輯延續將是關於 Quarkus 框架的故事,已經 經過考慮的 關於哈布雷。 今天的文章不是關於「亞原子超快 Java」的設計,而是更多關於 Quarkus 為 Enterprise 帶來的承諾。

Quarkus 如何結合命令式和反應式編程

Java 和 JVM 仍然非常流行,但是在使用無伺服器技術和雲端原生微服務時,Java 和其他 JVM 語言的使用越來越少,因為它們佔用太多記憶體空間並且載入得太慢,使得它們不太適合與短期容器一起使用。 幸運的是,由於 Quarkus,這種情況現在開始改變。

超快亞原子 Java 已達到新境界!

42 個版本、8 個月的社區工作和 177 名出色的開發人員 - 這一切的結果就是 2019 年 XNUMX 月的發布 誇庫斯 1.0,這個版本標誌著專案開發的一個重要里程碑,並提供了許多很酷的功能和功能(您可以在 公告).

今天,我們將向您展示 Quarkus 如何將命令式和反應式程式設計模型組合到單一反應式核心中。 我們將從簡短的歷史開始,然後詳細介紹 Quarkus 的反應式核心二元論是什麼以及如何實現 Java的- 開發人員可以利用這些好處。

微服務, 事件驅動架構 и 無服務器-功能——正如他們所說,今天所有這些都在增加。 最近,以雲端為中心的架構的創建變得更加容易和容易實現,但問題仍然存在——特別是對於 Java 開發人員而言。 例如,在無伺服器功能和微服務的情況下,迫切需要減少啟動時間,減少記憶體消耗,同時仍然使它們的開發更加方便和愉快。 Java 近年來做出了一些改進,例如改進了容器的人體工學功能等。 然而,讓 Java 在容器中正常運作仍然具有挑戰性。 因此,我們將首先了解 Java 的一些固有的複雜性,這些複雜性在開發容器導向的 Java 應用程式時尤其嚴重。

首先,讓我們回顧一下歷史。

Quarkus 如何結合命令式和反應式編程

流和容器

從8u131版本開始,由於人體工學功能的改進,Java開始或多或少地支援容器。 特別是,JVM 現在知道它運行在多少個處理器核心上,並且可以相應地配置執行緒池(通常是 fork/join 池)。 當然,這很棒,但假設我們有一個使用 HTTP servlet 並在 Tomcat、Jetty 等中運行的傳統 Web 應用程式。 因此,該應用程式將為每個請求提供一個單獨的線程,並允許其在等待 I/O 操作時(例如,在存取資料庫、檔案或其他服務時)阻塞該線程。 也就是說,此類應用程式的大小不取決於可用核心的數量,而是取決於同時請求的數量。 此外,這意味著 Kubernetes 中對核心數量的配額或限制在這裡不會有太大幫助,事情最終將以節流告終。

記憶體耗盡

線程是記憶體。 而且容器內記憶體限制絕不是萬能的。 只要開始增加應用程式和執行緒的數量,遲早您會遇到切換頻率的急劇增加,從而導致效能下降。 此外,如果您的應用程式使用傳統的微服務框架,或連接到資料庫,或使用緩存,或以其他方式耗盡內存,那麼您顯然需要一個工具,可以讓您查看JVM 內部並了解它如何管理內存而不殺死它。JVM 本身(例如,XX:+UseCGroupMemoryLimitForHeap)。 儘管自 Java 9 以來,JVM 已經學會接受 cgroup 並進行相應調整,但保留和管理記憶體仍然是一個相當複雜的問題。

配額和限制

Java 11 引入了對 CPU 配額的支援(如 PreferContainerQuotaForCPUCount)。 Kubernetes 也提供對限制和配額的支援。 是的,這一切都是有道理的,但是如果應用程式再次超出分配的配額,我們最終會再次得到​​大小(與傳統Java 應用程式的情況一樣),該大小由核心數量以及為每個核心分配一個單獨的線程決定。請求,那麼這一切就沒有意義了。
另外,如果使用配額和限製或Kubernetes底層平台的橫向擴充功能,問題也無法自行解決。 我們只是花費更多的資源來解決原來的問題,否則最終會超支。 如果它是公有雲中的高負載系統,我們幾乎肯定最終會使用比我們真正需要的更多的資源。

面對這一切該怎麼辦?

簡單來說,就是使用像Netty這樣的非同步非阻塞I/O函式庫和框架, 頂點.x 或阿卡。 由於其反應性,它們更適合在容器中工作。 由於非阻塞 I/O,同一執行緒可以同時處理多個請求。 當一個請求正在等待 I/O 結果時,處理該請求的執行緒將被釋放並由另一個請求接管。 當 I/O 結果最終到達時,第一個請求的處理將繼續。 透過在同一執行緒內交錯處理請求,可以減少執行緒總數並減少處理請求的資源消耗。

對於非阻塞 I/O,核心數量成為關鍵參數,因為它決定了可以並行執行的 I/O 執行緒數量。 如果使用正確,您可以有效地在核心之間分配負載,並用更少的資源處理更高的工作負載。

怎麼樣,就這些了嗎?

不,還有別的事。 響應式程式設計有助於更好地利用資源,但也是有代價的。 特別是,必須根據非阻塞原則重寫程式碼,並避免阻塞 I/O 執行緒。 這是一種完全不同的開發和執行模式。 而且雖然這裡有很多有用的庫,但這仍然是對通常思維方式的徹底改變。

首先,您需要學習如何編寫非同步運行的程式碼。 一旦開始使用非阻塞 I/O,您需要明確指定收到請求回應時應發生的情況。 簡單的阻塞和等待將不再起作用。 相反,您可以傳遞回調、使用反應式編程或延續。 但這還不是全部:要使用非阻塞 I/O,您需要非阻塞伺服器和客戶端,最好是無所不在。 就 HTTP 而言,一切都很簡單,但還有資料庫、檔案系統等等。

儘管端到端的總反應性可以最大限度地提高效率,但這種轉變在實踐中可能難以接受。 因此,結合反應式程式碼和命令式程式碼的能力成為以下先決條件:

  1. 有效利用軟體系統負載最重區域的資源;
  2. 在其餘部分使用更簡單的樣式程式碼。

誇庫斯簡介

實際上,這就是 Quarkus 的本質——在單一運行時環境中結合反應式模型和命令式模型。

Quarkus 基於 Vert.x 和 Netty,具有一系列響應式框架和擴充功能來幫助開發人員。 Quarkus 不僅設計用於建構 HTTP 微服務,也用於建構事件驅動的架構。 由於其反應性質,它可以非常有效地與訊息系統(Apache Kafka、AMQP 等)配合使用。

訣竅是如何對命令式程式碼和反應式程式碼使用相同的反應式引擎。

Quarkus 如何結合命令式和反應式編程

Quarkus 在這方面做得非常出色。 命令式和反應式之間的選擇是顯而易見的 - 兩者都使用反應式內核。 它真正有幫助的是快速、非阻塞的程式碼,可以處理通過事件循環線程(又稱 IO 線程)的幾乎所有內容。 但如果您有經典的 REST 或客戶端應用程序,Quarkus 已經準備好了命令式程式設計模型。 例如,Quarkus 中的 HTTP 支援基於非阻塞和反應式引擎(Eclipse Vert.x 和 Netty)的使用。 應用程式接收到的所有 HTTP 請求首先透過事件循環(IO 執行緒)傳遞,然後傳送到管理請求的程式碼部分。 根據目的地,可以在單獨的線程(所謂的工作線程,在 servlet 和 Jax-RS 的情況下使用)中調用請求管理程式碼,或使用來源 I/O 線程(反應式路由)。

Quarkus 如何結合命令式和反應式編程

訊息系統連接器使用在 Vert.x 引擎之上運行的非阻塞客戶端。 因此,您可以有效地傳送、接收和處理來自訊息中介軟體系統的訊息。

該網站 Quarkus.io 這裡有一些很好的教學可以幫助您開始使用 Quarkus:

我們還創建了線上實作教程,教您在瀏覽器中進行反應式程式設計的各個方面,無需 IDE,也不需要電腦。 你可以找到這些課程 這裡.

有用的資源

10 個關於 Quarkus 的影片課程,幫助您熟悉該主題

正如他們在網站上所說 Quarkus.io, 誇庫斯 - 是 Kubernetes面向 Java 堆疊,專為 GraalVM 和 OpenJDK HotSpot 量身定制,並由最佳 Java 函式庫和標準組裝而成。

為了幫助您理解該主題,我們選擇了 10 個影片教程,涵蓋 Quarkus 的各個方面及其使用範例:

1. Quarkus 簡介:Kubernetes 的下一代 Java 框架

作者:托馬斯·Qvarnstrom 和傑森·格林
Quarkus 專案的目標是為Kubernetes 和無伺服器環境建立一個Java 平台,並將反應式和命令式程式設計模型組合到單一執行時間環境中,以便開發人員在使用各種分散式應用程式架構時可以靈活地改變他們的方法。 在下面的介紹性講座中了解更多。

2. Quarkus:超快亞原子 Java

作者:布爾·薩特
DevNation Live 的這個影片教學示範如何使用 Quarkus 在 Kubernetes/OpenShift 環境中優化企業 Java 應用程式、API、微服務和無伺服器功能,使其更小、更快且更具可擴展性。

3. Quarkus 和 GraalVM:將 Hibernate 加速到超高速並將其縮小到亞原子大小

作者:桑尼‧格里諾韋羅
從演示中,您將了解 Quarkus 的誕生、它的工作原理以及它如何允許您建立與本機 GraalVM 映像相容的複雜程式庫(例如 Hibernate ORM)。

4. 學習開發無伺服器應用程式

作者:馬丁路德
下面的影片展示如何使用 Quarkus 建立一個簡單的 Java 應用程序,並將其部署為 Knative 上的無伺服器應用程式。

5. Quarkus:享受編碼的樂趣

作者:埃德森‧柳永
建立您的第一個 Quarkus 專案的影片指南,讓您了解 Quarkus 為何贏得開發者的青睞。

6. Java 和容器-它們的未來會怎樣

馬克·利特爾發表
本演講介紹了 Java 的歷史,並解釋了為什麼 Quarkus 是 Java 的未來。

7. Quarkus:超快亞原子 Java

作者:迪米特里斯·安德烈亞迪斯
概述了 Quarkus 獲得開發者認可的優勢:簡單、超高速、最好的函式庫和標準。

8.夸克和亞原子火箭系統

作者:克萊門特‧埃科菲
透過與 GraalVM 的集成,Quarkus 提供了超快速的開發體驗和亞原子運行時環境。 作者討論了 Quarkus 的反應式方面以及如何使用它來建立反應式和串流應用程式。

9. Quarkus 和 Eclipse MicroProfile 中的快速應用程式開發

作者:約翰‧克林根
透過結合 Eclipse MicroProfile 和 Quarkus,開發人員可以創建功能齊全的容器化 MicroProfile 應用程序,並在數十毫秒內啟動。 影片詳細介紹如何編寫容器化 MicroProfile 應用程式以在 Kubernetes 平台上部署。

10.Java,“Turbo”版本

作者:馬庫斯·貝爾
作者展示如何使用 Quarkus 創建超小型、超快速的 Java 容器,從而實現真正的突破,尤其是在無伺服器環境中。



來源: www.habr.com

添加評論