色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

為什么Apache Kafka會成為微服務架構事實上的標準和主干

GKwL_infoqchina ? 來源:InfoQ ? 2019-12-12 14:10 ? 次閱讀

微服務與領域驅動設計(DDD)有著共生關系。所謂領域驅動設計是一種設計方法,在這種方法中我們基于業務領域涉及的內容用軟件精心搭建出一套模型,這套模型隨著時間的推移而逐漸發展,但并不受運行系統的管道約束。我發現人們喜歡將這種模式與 Apache Kafka 結合起來,這種組合在實踐中也運用得越來越多了。在這類項目中,微服務架構通常使用 Kafka 作為事件流平臺;而領域驅動設計方法則用來定義各種有界上下文,這些上下文表示應用需要執行的各種業務流程。它們與各種事件結合在一起,創建了一個將各個有界上下文與下游出現的上下文分離的單向依賴圖,以創建豐富多樣的事件流業務應用。本文將探討為什么 Apache Kafka 會成為微服務架構事實上的標準和主干——Kafka 不僅取代了其他傳統的中間件,而且人們還使用 DDD 和 Kafka 原生 API(如 Kafka Streams、KSQL 和 Kafka Connect)直接構建微服務。 1 微服務

如今人們都想用微服務創建敏捷而靈活的架構,微服務這個術語在很多環境中都很常見。

雖然微服務并不是什么免費的午餐,但它們確實提供了許多好處,解耦就是其中一項優勢。解耦是圍繞業務功能來組織系統,以形成分散的體系結構的過程。其中智能端點和啞管道(dumb pipe)會確保:

基于微服務構建的應用程序需要盡可能分散開來,同時還保持緊密的協作關系——它們擁有自己的領域邏輯(這些邏輯針對的是各自需要處理的業務問題),且行為更像是經典的 Unix 系統中的過濾器——接收一個請求,對其應用合適的邏輯并生成回應。—— Martin Fowler

https://martinfowler.com/articles/microservices.html

2 Apache Kafka——微服務的事件流平臺

應該使用哪些技術來構建微服務架構?這個問題可以分為兩部分來回答:

1. 微服務之間怎樣相互通信

當我們考慮微服務之間的通信問題時(比如說與同步 HTTP(S) 調用進行通信),大多數人一開始會使用 REST 這個方法。很多用戶場景都可以使用這種方法。但是,請求——響應模式所創建的點對點連接會將發送方與接收方的通信來往耦合在一起,這樣就很難在不影響其他組件的情況下更改某個組件。

因此許多架構師使用中間件作為微服務通信的主干,以創建解耦、可擴展和高度可用的系統。很多東西都能拿來用作中間件——比如說一些自定義粘合代碼或框架、像 RabbitMQ 這樣的消息傳遞系統、像 Talend 這樣的 ETL 工具、像 WSO2 這樣的 ESB,或者像 Apache Kafka 這樣的事件流平臺。

2. 如果你要使用中間件,該用哪個?

Apache Kafka 之所以能成為微服務事實上的標準,主要原因是它融合了三個強大的概念:

發布和訂閱事件流,類似于消息隊列或企業消息傳遞系統

以容錯方式存儲事件流

在事件流發生時實時處理

Kafka 將這三大支柱一起內置到了一個分布式事件流平臺中,這樣用戶就可以用可靠、可擴展和容錯的方式將各種微服務(例如生產者和消費者)分離開來。

為了更好地理解 Apache Kafka 相比傳統中間件(如 MQ、ETL 或 ESB 工具)的優勢,請參閱”Apache Kafka vs 企業服務總線——朋友,敵人還是亦敵亦友?”

下面探討像 Apache Kafka 這樣的事件流平臺是怎樣與領域驅動設計方法建立聯系的。

3 用于構建和解耦微服務的領域驅動設計方法(DDD)

領域驅動設計(DDD)最早是由 Eric Evans 在他的一本著作中提出來的方法,用于構建包含復雜業務領域的系統。也就是說你不會將 DDD 應用于基礎架構軟件或構建路由器、代理或緩存層之類的項目中,而是會應用到解決實際業務問題的軟件項目上。這種技術很好用,可以將業務模型與將各種模型連接在一起的管道代碼分離開來。將這兩部分在軟件層面分離開來之后,團隊就很容易去設計、建模、構建并改進具體的產品實現。

DDD 方法基于下列原則:

https://techbeacon.com/app-dev-testing/get-your-feet-wet-domain-driven-design-3-guiding-principles

團隊需要與領域專家交流,從而使用領域術語搭建領域模型

在領域代碼中嵌入領域術語

保護領域知識免受來自其他領域和技術子域的損害

本文討論的 DDD 核心概念是有界上下文。大型項目通常有許多種領域模型和有界上下文。但開發人員將不同種類有界上下文中的代碼組合在一起的過程中,軟件系統可能會變得越來越不可靠且難以理解。團隊成員之間越來越難溝通,而且人們通常很難搞清楚某個模型不該應用在哪些上下文中。

因此,DDD 要求我們明確定義每個模型所應用的上下文對象。我們在設置邊界時需要考慮下列因素:哪個團隊擁有該模型、應用程序特定部分的用途、以及諸如代碼庫和數據庫 schema 之類的物理表現等。將各個模型嚴格約束在自己的邊界內后,各個部分就更容易實現和理解,因為我們只需要考慮每個部分所屬的一個有界上下文就夠了。我們不用再因為其他人泄露的代碼而分散精力或感到困惑。正如 Dan North 所說:“專心構建你負責的代碼,不用想太多”。

https://www.youtube.com/watch?v=4Y0tOi7QWqM

一個事件流平臺可能看起來像這樣:

在平臺中每個微服務都有自己的有界上下文。從技術角度來看,這可能涉及不同的 API、框架、通信協議和數據存儲等。有些部分遵循請求——響應模式,而其他部分則根據需要解決的問題來使用事件。總而言之,每個部分都是一個單獨的有界上下文,擁有屬于自己的領域模型,并在該模型、業務流程和它與其他部分共享的數據之間建立映射。

那么為什么 Kafka 就是事件流平臺的不二之選呢?

4 Apache Kafka 和領域驅動的微服務

Apache Kafka 結合了消息傳遞和存儲能力,使不同的生產者和消費者之間能夠完全解耦:

服務端(Kafka broker、ZooKeeper 和 Confluent Schema 注冊表)可以與業務應用之間分離開來。

生產者不知道或不關心是誰在消費它們創造的事件。Kafka 為他們處理背壓、解決可擴展性和高可用性需求。

生產者的生產工作不受消費者下線影響。

就算新的消費者需要從較早的時間戳開始消費事件,它們也可以隨時添加進來。

消費者可以以自己的節奏(批量或實時)處理數據。

消費者可以反復處理數據(例如訓練不同的分析模型或從錯誤和數據損壞中恢復)。

有了這些特性,項目團隊就都能擁有自己的領域了;這些領域可以有不同的職責、SLA、版本控制和技術選擇。

這種方法不僅適用于業務應用,也適用于公司 IT 團隊的運營工作;運營團隊可以擁有用于內部自助服務的 Kafka 集群。Kafka 集群通常基于 PaaS 架構部署,例如 Kubernetes 和 Confluent Operator 等。如果使用基于 Confluent Cloud 等托管服務的云部署方案,則通常不需要此類基礎架構團隊。

5 領域模型、有界上下文和通用語言

如上所述,領域驅動設計(DDD)的關鍵元素之一是將業務問題分離為許多獨立的有界上下文的集合。每個上下文都有一個領域模型,將所需數據完全封裝在軟件里,還包括需要執行的業務操作以及用于描述這些元素的語言。但是,某個有界上下文中的領域模型該怎樣與其他上下文中的模型建立聯系呢?我們如何保證一個模型中的更改不會對其他領域模型產生負面影響?

答案就是使用在 DDD 中被稱為反腐層(anti-corruption layer)的方法:反腐層將領域模型中使用的數據映射到在各個微服務或有界上下文之間傳輸的數據上。這個模式與具體的實現無關,這意味著無論你的服務是通過事件還是通過請求——響應協議通信,都可以使用反腐層。在這兩種通信方式下通常都會有一種有線格式(可以是用來從 REST 端點返回數據的 schema,或是用來描述事件的 schema,例如存儲在 Schema 注冊表中的 Avro 消息)。

反腐層有兩大職責:

它讓領域模型不受其他模型的更改影響

它封裝了上下文之間的邊界,并描述了它們之間的映射。這種映射既能從技術意義上描述,例如一條消息中的字段 A 映射到模型中的字段 B;也能基于 DDD 的通用語言描述——將事件 schema 中的對手(counterparty)映射到領域模型中的客戶(customer)。

每個有界上下文中的模型都會進化發展,而團隊在設計改進模型的過程中,要經歷的一項關鍵步驟就是設計將各個模型連接在一起的接口。要走好這一步,首先應該由開發人員和擁有系統的利益相關方共同開發一種通用語言。

6 使用Apache Kafka、Kafka Streams、KSQL和Kafka Connect 將各個領域連接起來

還有一個關鍵要點我們還沒討論過:Apache Kafka 不僅是一個消息系統或者一個集成層——它是一個事件流平臺。這意味著它不僅負責提供用來解耦微服務的中間件,還允許你在客戶端代碼中執行復雜的數據操作,如拆分、連接、過濾和匯總等。這是 Apache Kafka 和傳統中間件之間的另一大區別所在,正如 ThoughtWorks 所解釋的那樣:

……我們看到一些組織將許多 Kafka 生態系統組件(例如連接器和流處理器)集中在一起,使用 Kafka 重建了 ESB 這種反模式,而不是讓這些組件與產品或服務團隊共存。ESB 模式有著很嚴重的問題,人們將越來越多的邏輯、編排和轉換推入集中管理的 ESB 中,不得不愈加依賴中心化的團隊。我們指出這一現象就是想讓人們不要再推進這種有缺陷的模式了。“使用 Kafka 重建 ESB 反模式”

https://www.thoughtworks.com/radar/techniques/recreating-esb-antipatterns-with-kafka

這一點是很重要的。ESB 之所以會包含復雜的邏輯、編排和轉換并不是偶然產物,而是因為人們正在構建的業務流程需要它們。ThoughtWorks 的觀點并不是說這些過程本身是問題所在,或者沒什么必要,而是說問題出在這些過程被推出了本應擁有它們的應用所在的邊界,并推入了中心化的基礎架構中。這種中心化的基礎架構和業務邏輯導致軟件愈加脆弱,難以發展——這正是現代化的敏捷軟件項目最不想看到的結果。

事件流系統則使用另一種方式處理這個問題。它們基于啞管道(可高度擴展)和智能過濾器構建;要注意這些過濾器比以往的設計更強大、功能更多。嵌入在微服務中的過濾器具有現代流處理引擎的所有功能。沒有中心化的邏輯,一切都是完全分散的,這意味著每個有界上下文都有自己的業務邏輯、編排和轉換等等。

因此,使用 Kafka 作為中樞系統后,你就可以使用流處理工具提供的更高級抽象來連接在各個有界上下文中創建的模型了。

這樣你就可以充分利用 DDD 的所有優勢,同時避免 ESB 導致的種種麻煩——諸如緊密耦合、集中管理整個業務流程等。

具體選擇實現哪個微服務完全取決于團隊的工作需要。你們的微服務可以使用簡單的技術接口,如 REST 或 JMS 這樣只用來通信的接口。你們也可以構建真正的事件流式微服務,充分利用流處理的能力來操縱事件數據流并將其映射到你們的內部模型上。

前面的例子中提到了許多種微服務。有些情況下會使用 REST(例如在微服務和 UI 之間通信),有些則使用 Kafka Streams 或 KSQL 將不同來源的事件連接在一起。還有的情況下會使用 Kafka Connect 將事件簡單地推送到數據庫中,以便進一步操作或直接通過事件源模式使用事件。每個微服務都可以選擇自己獨立的技術實現,與其他微服務和它們選擇的技術無關。

如何構建這樣的系統人們很容易想到使用 REST、gRPC 或其他一些請求——響應協議構建分散的事件流微服務。但對許多人來說,構建一種基于事件的系統更是觀念上的變革。用事件構建系統的方式是多種多樣的。它們可以用于“發后即忘”消息傳輸,也可以用作協作手段。Ben Stopford 的博客文章“在事件的基礎上構建服務”進一步解釋了這些模式。

你還必須決定該如何管理狀態。可以使用 Kafka Connect 等技術在數據庫中管理,也可以使用 Kafka Streams API 在托管服務中管理。關于構建有狀態事件流的微服務,可以參閱 Ben Stopford 的博客文章“使用 Kafka Streams 和 KSQL 構建微服務生態系統”。

要從宏觀層面了解如何將 Connect、Kafka Streams 和微服務組合在一起,可以參閱 Yeva Byzek 的一篇寫得很棒的文章。

https://www.confluent.io/blog/stream-processing-part-1-tutorial-developing-streaming-applications

最后,構建微服務生態系統只是問題的第一部分。生態系統構建完成后,你需要對其檢測、控制和操作。具體內容可參閱這篇文章。

https://www.confluent.io/blog/journey-to-event-driven-part-4-four-pillars-of-event-streaming-microservices

還有一件事值得一提,就是 Confluent 的 RBAC 功能;它允許在 Confluent 平臺上執行基于角色的訪問控制。你可以詳細配置每個域組可以訪問的資源(如 Kafka 主題、Schema 注冊表或連接器等)。

只需挑選最適合你的架構即可。例如,你可以讓每個 Kafka Connect 群集由負責它的領域團隊運營,或者把 Kafka Connect 托管為 Kafka 群集的一部分,并允許團隊為其部署連接器。

有這么多工具幫助你使用 DDD 方法構建和運行基于微服務的系統,我希望你能從中獲益多多。

7 Apache Kafka+領域驅動設計(DDD)=解耦事件流微服務

雖然有許多方法可以構建微服務架構,但領域驅動設計(DDD)中描述的方法無疑是最強大的,特別是當你構建的系統具有復雜的業務領域(例如醫療保健、金融、保險、 零售)時更是如此。

DDD 中的許多設計原則都能直接用于事件驅動系統,有一些原則本文還沒具體涉及到;我強調的是最常見的技術挑戰:如何將應用分離到各個有界上下文中,為什么這些上下文的獨立性如此重要,為什么需要領域模型,以及這些概念與消息傳遞、Apache Kafka 和事件的使用有什么關系。

在當今眾多工具的幫助下,微服務架構得以使用事件流平臺將各個微服務分離開來,并從中獲益匪淺。實現可以是請求驅動的,可以是簡單的事件驅動系統,也可以是整個事件流業務應用。它們還可以是這些概念的某種混合產物。DDD 提供了一套管理各個部分之間相互作用的基本技術,包括通用語言、有界上下文,schema 和反腐層等。如你所見,事件和消息傳遞是讓這些系統在實踐中良好運行的關鍵因素。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 通信
    +關注

    關注

    18

    文章

    6039

    瀏覽量

    136111
  • Apache
    +關注

    關注

    0

    文章

    64

    瀏覽量

    12474
  • 微服務
    +關注

    關注

    0

    文章

    137

    瀏覽量

    7363

原文標題:為什么 Kafka 會成為微服務架構的事實標準?

文章出處:【微信號:infoqchina,微信公眾號:InfoQ】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    寶藏級微服務架構工具合集

    寶藏級熱門微服務架構工具包含Spring Boot、Eclipse Vert.X、Kubernetes、Tyk、RabbitMQ、Apache Kafka等。其中,Spring Boo
    的頭像 發表于 12-21 16:33 ?174次閱讀

    超詳細“零”基礎kafka入門篇

    1、認識kafka 1.1 kafka簡介 Kafka?是一個分布式流媒體平臺 kafka官網:http://kafka.apache.or
    的頭像 發表于 12-18 09:50 ?372次閱讀
    超詳細“零”基礎<b class='flag-5'>kafka</b>入門篇

    NVIDIA NIM微服務登陸亞馬遜云科技

    經過優化的 NIM 微服務現可在 Amazon Bedrock Marketplace、SageMaker JumpStart 和 AWS Marketplace 獲取,用于各種 NVIDIA 和生態系統模型。
    的頭像 發表于 12-06 13:33 ?225次閱讀

    k8s微服務架構就是云原生嗎?兩者是什么關系

    k8s微服務架構就是云原生嗎?K8s微服務架構并不等同于云原生,但兩者之間存在密切的聯系。Kubernetes在云原生架構中扮演著核心組件的
    的頭像 發表于 11-25 09:39 ?164次閱讀

    SSR與微服務架構的結合應用

    隨著互聯網技術的快速發展,前端技術棧不斷更新迭代,后端架構也經歷了從單體應用到微服務的變革。在這個過程中,服務端渲染(SSR)作為一種提升頁面加載速度和SEO性能的技術,與微服務
    的頭像 發表于 11-18 11:34 ?350次閱讀

    架構與設計 常見微服務分層架構的區別和落地實踐

    架構風格越傾向于清晰的職責定位,且讓領域模型成為架構的核心。 基于這些架構風格,在軟件架構設計過程中又有非常多的
    的頭像 發表于 10-22 15:34 ?263次閱讀
    <b class='flag-5'>架構</b>與設計 常見<b class='flag-5'>微服務</b>分層<b class='flag-5'>架構</b>的區別和落地實踐

    微服務架構與容器云的關系與區別

    微服務架構與容器云密切相關又有所區別。微服務將大型應用拆分為小型、獨立的服務,而容器云基于容器技術,為微服務提供構建、發布和運行的平臺。區別
    的頭像 發表于 10-21 17:28 ?247次閱讀

    入門級攻略:如何容器化部署微服務

    第一步理解容器化基礎,第二步創建Dockerfile,第三步構建推送鏡像,第四步部署微服務,第五步管理微服務、第六步優化更新。容器化部署微服務是現代軟件開發中的一種高效方法,可提供良好的可移植性、可擴展性和管理性。容器化部署
    的頭像 發表于 10-09 10:08 ?163次閱讀

    Proxyless的多活流量和微服務治理

    1. 引言 1.1 項目的背景及意義 在當今的微服務架構中,應用程序通常被拆分成多個獨立的服務,這些服務通過網絡進行通信。這種架構的優勢在于
    的頭像 發表于 08-28 16:54 ?1600次閱讀
    Proxyless的多活流量和<b class='flag-5'>微服務</b>治理

    NVIDIA NIM微服務帶來巨大優勢

    服務通過熱門 AI 模型為數百萬開發者帶來高達 5 倍的 token 效率提升,使他們能夠立即訪問在 NVIDIA DGX Cloud 運行的 NIM 微服務
    的頭像 發表于 08-23 15:20 ?508次閱讀

    采用OpenUSD和NVIDIA NIM微服務創建精準品牌視覺

    全球領先的創意和制作服務機構率先采用 OpenUSD 和 NVIDIA NIM 微服務來創建精準的品牌視覺。
    的頭像 發表于 08-01 14:33 ?442次閱讀

    服務apache如何配置解析php文件?

    在云服務配置Apache以解析PHP文件通常需要以下步驟: 1、安裝PHP:首先確保在服務安裝了PHP。你可以使用包管理工具(如ap
    的頭像 發表于 04-22 17:27 ?1032次閱讀

    Prometheus監控業務指標詳解

    在 Kubernetes 已經成了事實上的容器編排標準之下,微服務的部署變得非常容易。但隨著微服務規模的擴大,服務治理帶來的挑戰也會越來越大
    的頭像 發表于 01-24 10:32 ?611次閱讀
    Prometheus監控業務指標詳解

    Apache服務器和Nginx服務

    Apache和Nginx都是常見的開源Web服務器軟件,它們用于處理HTTP請求并提供網站和應用程序的服務。下面是對Apache和Nginx的一些基本特點的比較: 一、
    的頭像 發表于 01-22 16:48 ?576次閱讀

    Java微服務隨機掉線排查過程簡析

    我們的業務共使用 11 臺(阿里云)服務器,使用 SpringcloudAlibaba 構建微服務集群, 共計 60 個微服務, 全部注冊在同一個 Nacos 集群。
    的頭像 發表于 01-13 17:41 ?954次閱讀
    Java<b class='flag-5'>微服務</b>隨機掉線排查過程簡析
    主站蜘蛛池模板: 受坐在攻腿上H道具PLAY| 又粗又大又爽又黄的免费视频| 99久久国产露脸精品国产麻豆 | 国产精品第100页| 亚洲精品成人AV在线观看爽翻| 久久国产高清字幕中文| 99久久无码一区人妻A片竹菊 | 欧美成人免费一区二区三区不卡| 东北女人一级毛片| 亚洲嫩草影院久久精品| 乱淫67194| 国产福利视频一区二区| 一区二区不卡在线视频| 日本吃孕妇奶水免费观看| 黄网13区| 超碰免费视频公开97| 亚洲视频精品| 色99久久久久高潮综合影院| 精品一区二区三区AV天堂| 被肉日常np高h| 一个人免费播放高清在线观看| 琪琪婷婷五月色综合久久| 狠狠色噜噜狠狠狠狠米奇777| 99久久全国免费久久爱| 亚洲精品白色在线发布| 欧美伊人久久大香线蕉综合69| 韩国无遮羞禁动漫在线观看96| 俺来也俺去也视频久久| 在线自拍亚洲视频欧美| 学生妹被爆插到高潮无遮挡| 女同给老师下媚药| 精品国产乱码久久久久久人妻 | 亚洲 无码 制服 日韩| 欧美激情视频一区二区| 久久er国产精品免费观看2| 国产白丝JK被疯狂输出视频| 97国产成人精品视频| 亚洲午夜性春猛交XXXX| 甜性涩爱在线播放| 欧洲video60| 麻花豆传媒剧国产免费mv观看|