使用Kafka建立可靠的高性能分佈式消息傳遞基礎結構

通過優銳課核心java學習筆記中,我們可以看到,碼了很多專業的相關知識, 分享給大家參考學習。

實施資源適配器以將Kafka與企業Java解決方案集成

由於世界已經變得移動化,因此應用程序現在必須實時提供數據。 不僅重要的是存儲在數據庫表中的最終結果,而且重要的是用戶在使用應用程序時執行的所有操作。 無論可用的任何信息(例如用戶點擊,日誌數據或傳感器數據)用於增強用戶體驗,生成報告,爲機器學習系統供稿,等等。 今天,開發人員必須專注於基於實時事件流的系統。

下圖顯示了基於事件流處理的體系結構示例。
使用Kafka建立可靠的高性能分佈式消息傳遞基礎結構

Apache Kafka已將其自身確立爲構建高度可擴展的基於事件的系統首選解決方案。Kafka爲事件流平臺提供了快速發展的功能,開發人員可以在現代業務解決方案中使用它。但是,開發人員經常需要將基於IBM MQ或IBM WebSphere Application Platform之類的技術現有Java EE業務解決方案集成到這些新的事件流體系結構中。

考慮這個例子。一家在線商店擁有一個移動應用程序,該應用程序使用Kafka將付款請求數據發送到以Enterprise Java實現的分佈式付款系統。該解決方案必須絕對保證一次完整的付款請求處理過程(避免向買方收取多次費用)。 但是,在分佈式系統中不可避免發生故障,因此該解決方案需要妥善處理故障。

使用Apache Kafka實現消息傳遞

Apache Kafka是用於事件流處理的分佈式系統,廣泛用於微服務架構和基於雲的環境中。它提供消息傳遞,存儲和事件處理,所有這些都在同一平臺內。
下圖顯示了Apache Kafka組件的基本拓撲,包括通過Kafka集羣基礎結構交換消息的生產者和消費者。
使用Kafka建立可靠的高性能分佈式消息傳遞基礎結構

儘管Kafka有很多優勢,但Kafka仍在努力解決以下問題:

在消息處理失敗的情況下進行手動補償的邏輯,這可能導致消息無法處理
不支持XA事務處理
確保在消費者應用程序中進行一次準確的交付處理
將其集成到企業解決方案中的額外開發和可維護性工作

要解決Kafka集成問題,你可以應用傳統的消息傳遞拓撲概念,例如事務日誌,恢復日誌和XA事務。你可以實現基於Java EE連接器體系結構(JCA)的資源適配器。使用此JCA資源適配器,可以爲應用程序服務器提供ACID功能,以進行Kafka消息處理。然後,此JCA資源適配器提供了與Enterprise Java應用程序的無縫Kafka集成。

實施JCA資源管理員

Java EE連接器體系結構定義了一組可伸縮,安全和事務機制。 你可以將JCA資源適配器安裝到任何符合Java EE的應用程序服務器中,例如IBM Websphere Application Server,IBM Business Process Manager,JBoss,WebSphere Liberty,Glassfish或Weblogic。

Java EE連接器體系結構規範還提供了一組標準合同,這些合同允許企業應用程序和企業信息系統(例如Kafka)之間進行通信。JCA資源適配器可以插入應用程序服務器,並通過照顧所有系統級機制(事務,連接管理,崩潰恢復,錯誤跟蹤和日誌記錄)來啓用Kafka集成。JCA資源適配器將從需要與之集成的企業應用程序中隱藏所有Kafka通信邏輯。通過實現JCA資源適配器,企業應用程序提供商可以專注於實現業務和表示邏輯,而不是與Kafka集成相關的底層邏輯。因此,JCA資源適配器僅需開發一次,即可被不同的應用程序重用。

通過查看下圖顯示設計的解決方案系統上下文,將其與我們的在線商店付款方案相關聯。
使用Kafka建立可靠的高性能分佈式消息傳遞基礎結構

移動應用程序將付款請求數據發送到Kafka,後者通過Kafka資源適配器與付款企業應用程序集成在一起。此外,還使用適配器將付款通知發送到Kafka。 適配器啓動XA事務,該事務將傳播到支付企業應用程序以及通知系統。因此,與付款請求處理相關的所有任務將在同一全局事務中運行,並且一起完成或失敗。該設計除了要讀取或寫入數據的主題外,還需要在Kafka上設置重試,死信和事務日誌主題。

現在,讓我們更詳細地探討從移動應用程序發送和發送到移動應用程序的消息的處理。

入站流

在我們的支付方案中,入站流程是指由在線商店移動應用程序發起的通信,該通信將支付請求數據發送到Kafka。資源適配器提供Kafka連接,並異步將消息傳遞到應用程序服務器上存在的消息端點。這可以使用JCA規範定義的消息流入合同來實現。

Kafka JCA資源適配器使用一組用於端點激活配置的配置屬性來實現激活規範JavaBean。這些配置詳細信息定義爲應用程序服務器配置的一部分。

資源適配器會定期輪詢入站Kafka主題的一批付款請求。成功輪詢數據後,它將遍歷數據批次,並異步將消息傳遞到終結點實例。 每個消息端點可能存在多個端點實例,這使併發消息消耗並提供高吞吐量。

Kafka消費者補償是在安排消息傳遞之後立即提交的,以避免批次阻塞的問題。 這種設計是可行的,因爲資源適配器通過需要在Kafka上設置重試,死信和事務日誌主題來實現故障轉移過程。在我們的例子中,端點需要支持XA事務,並且需要在向端點發送數據之前創建事務上下文,從而提供原子消息消耗。
使用Kafka建立可靠的高性能分佈式消息傳遞基礎結構

如果事務將被應用程序服務器中止,則應回滾端點實例完成的所有工作,並將消息轉發給Kafka重試主題。

適配器使用來自Kafka重試主題的消息並對其進行重新處理。在超過配置的重試次數以處理消息之後,適配器會將消息轉移到Kafka死信主題。

由於發送到空頭郵件主題的消息包含有價值的業務數據,因此監視主題非常重要。

出站流量

出站流是指由企業應用程序啓動的Kafka通信。在我們的情況下,這是用於將付款確認發送到移動應用程序的通知系統。JCA規範定義了一個連接管理協定,該協定使應用程序服務器能夠池化Kafka連接,從而提供了可支持大量客戶端的可擴展環境。
Kafka出站連接配置詳細信息是使用Managed Connection Factory JavaBean定義的。使用這些配置詳細信息,適配器使管理員和開發人員可以配置Kafka生產者並決定功能,例如可靠性,可用性,吞吐量,延遲和事務支持。這些配置詳細信息定義爲應用程序服務器配置的一部分。

Kafka JCA資源適配器公開了實現CCI(通用客戶端接口)和JMS(Java Message Service)接口的Kafka連接工廠和Kafka連接。應用程序組件使用JNDI(Java命名和目錄接口)名稱查找連接工廠。成功獲取工廠後,應用程序將其用於獲取訪問Kafka的連接。因此,您可以爲通知系統應用程序無縫添加Kafka集成,該集成當前將數據發送到IBM MQ或Active MQ之類的JMS消息傳遞提供程序。

資源適配器出站流封裝了底層的Kafka通信邏輯,並提供以下內容:

連接池
使用Kafka交易機制僅保證一次交貨
準確的識別,記錄和處理Kafka故障
實現XA事務,因此在分佈式系統中使用Kafka提供可靠的消息處理。

爲了管理出站流中的事務,Kafka資源適配器使用JCA規範定義的事務管理協定。
使用Kafka建立可靠的高性能分佈式消息傳遞基礎結構
在我們的情況下,需要將連接工廠設置爲支持XA事務,並且當客戶端獲得連接時,適配器需要啓動Kafka事務。如果應用服務器在任何時候回滾該事務,則將終止Kafka事務。在發生XA事務提交的情況下,事務管理器跨參與運行的事務的所有資源執行兩階段提交協議。這樣可以保證對委託 管理資源的所有讀/寫訪問都完全落實或回退。

最後,資源適配器通過將事務數據寫入Kafka事務日誌主題來跟蹤正在運行的事務。 寫入事務日誌主題的數據用於崩潰恢復處理,該崩潰恢復處理在分佈式系統中提供可靠的消息處理。

結論

設計Kafka JCA適配器的方法提供了與標準企業Java解決方案的Kafka事件處理平臺的“即插即用” JMS集成。該設計使你可以將Kafka與現有企業應用程序無縫集成,而無需實施補償邏輯。該適配器還使應用程序服務器能夠爲企業應用程序所依賴的Kafka連接性和事務管理提供基礎結構和運行時環境。
使用Kafka建立可靠的高性能分佈式消息傳遞基礎結構

喜歡這篇文章的可以點個贊,歡迎大家留言評論,記得關注我,每天持續更新技術乾貨、職場趣事、海量面試資料等等
 > 如果你對java技術很感興趣也可以交流學習,共同學習進步。 
不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代

文章寫道這裏,歡迎完善交流。最後奉上近期整理出來的一套完整的java架構思維導圖,分享給大家對照知識點參考學習。有更多JVM、Mysql、Tomcat、Spring Boot、Spring Cloud、Zookeeper、Kafka、RabbitMQ、RockerMQ、Redis、ELK、Git等Java乾貨

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章