天天看點

當 RocketMQ 遇上 Serverless,會碰撞出怎樣的火花?

想必大家都比較了解 RocketMQ 消息服務,那麼 RocketMQ 與 Serverless 結合會碰撞出怎樣的火花呢?我們今天介紹一下如何基于 RocketMQ + Knative 驅動雲原生 Serverless 應用 。

當 RocketMQ 遇上 Serverless,會碰撞出怎樣的火花?

作者 | 元毅  阿裡巴巴進階開發工程師

阿裡巴巴雲原生公衆号背景回複 Knative,免費下載下傳《Knative 雲原生應用開發指南》電子書!

想必大家都比較了解 RocketMQ 消息服務,那麼 RocketMQ 與 Serverless 結合會碰撞出怎樣的火花呢?我們今天介紹一下如何基于 RocketMQ + Knative 驅動雲原生 Serverless 應用 。本文主要從以下幾個方面展開介紹:

  • 雲原生與 Serverless
  • Knative 簡介
  • RocketMQSource
  • 餐飲配送場景示例

雲原生

先看一下 CNCF 對雲原生的定義:

雲原生技術有利于各組織在公有雲、私有雲和混合雲等新型動态環境中,建構和運作可彈性擴充的應用。雲原生的代表技術包括容器、服務網格、微服務、不可變基礎設施和聲明式 API。

當 RocketMQ 遇上 Serverless,會碰撞出怎樣的火花?

這些技術能夠建構容錯性好、易于管理和便于觀察的松耦合系統。結合可靠的自動化手段,雲原生技術使工程師能夠輕松地對系統作出頻繁和可預測的重大變更。

其實雲原生旨在以标準化雲服務的提供方式銜接雲廠商和客戶。這種方式對于客戶而言降低了上雲和跨雲遷移的成本,讓客戶始終保有和雲廠商議價的能力;對雲廠商而言,因為客戶跨雲遷移的成本低,是以隻要能提供成本效益更高的雲服務,就能很容易的聚集大量使用者。

Serverless

當 RocketMQ 遇上 Serverless,會碰撞出怎樣的火花?

Serverless(無伺服器架構)是指服務端邏輯由開發者實作,運作在無狀态的計算容器中,由事件觸發,完全被第三方管理,其業務層面的狀态則存儲在資料庫或其他媒體中。

Serverless 可以了解為雲原生技術發展的進階階段,使開發者更聚焦在業務邏輯,而減少對基礎設施的關注。

這裡提到的是 Functions Serverless, 其實除了 Functions Serverless, 還有另外一種 Serverless 形态:容器化的Serverless。相較于 Function Serverless,容器化的 Serverless, 可移植性更強, 開發者對複雜應用程式能進行更好的掌控。除此之外,對于那些經曆過容器時代洗禮的使用者,容器化的 serverless或許是一種更好的選擇。

對于Serverless, 有如下幾點需要關注一下:

  • 事件(event)驅動:Serverless 是由事件(event)驅動(例如 HTTP、pub/sub)的全托管計算服務;
  • 自動彈性:按需使用,削峰填谷;
  • 按使用量計費:相對于傳統服務按照使用的資源(ECS 執行個體、VM 的規格等)計費,Serverless 場景下更多的是按照服務的使用量(調用次數、時長等)計費;
  • 綠色的計算: 所謂綠色的計算其實就是最大化的提升資源使用效率,減少資源浪費,做的“節能減排”。

Knative

上面提到了容器化的 Serverless,那麼有沒有這樣的 Serveless 平台架構呢?答案就是:Knative。

當 RocketMQ 遇上 Serverless,會碰撞出怎樣的火花?

Knative 是在 2018 的 Google Cloud Next 大會上釋出的一款基于 Kubernetes 的 Serverless 編排引擎。Knative 一個很重要的目标就是制定雲原生、跨平台的 Serverless 編排标準。Knative 是通過整合容器建構(或者函數)、工作負載管理(彈性)以及事件模型這三者來實作的這一 Serverless 标準。Knative 社群的目前主要貢獻者有 Google、Pivotal、IBM、RedHat。另外像 CloudFoundry、OpenShift 這些 PaaS 提供商都在積極的參與 Knative 的建設。

1. Knative 核心子產品

Knative 核心子產品主要包括事件驅動架構 Eventing 和部署工作負載的 Serving。

當 RocketMQ 遇上 Serverless,會碰撞出怎樣的火花?

2. Serverless 服務引擎 - Serving

當 RocketMQ 遇上 Serverless,會碰撞出怎樣的火花?

Knative Serving 核心能力就是其簡潔、高效的應用托管服務,這也是其支撐 Serverless 能力的基礎。Knative 提供的應用托管服務可以大大降低直接操作 Kubernetes 資源的複雜度和風險,提升應用的疊代和服務傳遞效率。當然作為 Severlesss Framework 就離不開按需配置設定資源的能力,阿裡雲容器服務 Knative 可以根據您應用的請求量在高峰時期自動擴容執行個體數,當請求量減少以後自動縮容執行個體數,可以非常自動化的幫助您節省成本。

Serving 通過與 Istio 結合還提供了強大的流量管理能力和靈活的灰階釋出能力。流量管理能力可以根據百分比切分流量,灰階釋出能力可以根據流量百分比進行灰階,同時灰階釋出能力還能通過自定義 tag 的方式進行上線前的測試,非常便于和自己的 CICD 系統內建。

Serving 應用模型

當 RocketMQ 遇上 Serverless,會碰撞出怎樣的火花?
  • Service: 對應用 Serverless 編排的抽象,通過 Service 管理應用的生命周期;
  • Configuration: 目前期望狀态的配置。每次更新 Service 就會更新 Configuration;
  • Revision: configuration 的每次更新都會建立一個快照,用來做版本管理;
  • Route: 将請求路由到 Revision,并可以向不同的 Revision 轉發不同比例的流量。

3. 事件驅動架構 - Eventing

當 RocketMQ 遇上 Serverless,會碰撞出怎樣的火花?

1.采用 CloudEvent 作為事件傳輸協定: CloudEvent 以通用的格式描述事件資料,提供跨平台的服務互動能力。KnativeEventing 使用 CloudEvent 作為事件傳輸标準,極大的提升了應用的跨平台可移植性;

2.外部事件源接入和注冊: 提供 Github、RocketMQ 以及 Kafka 等事件源的支援,當然使用者可以自定義事件源。

3.事件的訂閱和觸發:引入 Broker 和 Trigger 模型意義,不僅将事件複雜的處理實作給使用者屏蔽起來,更提供豐富的事件訂閱、過濾機制;

4.相容現有消息系統:KnativeEventing 充分解耦了消息系統的實作,目前除了系統自身支援的基于記憶體的消息通道 InMemoryChannel 之外,還支援 Kafka、NATSStreaming 等消息服務,此外可以友善的對接現有的消息系統。

Eventing 中 Broker/Trigger模型

當 RocketMQ 遇上 Serverless,會碰撞出怎樣的火花?

這裡介紹一下 Eventing 中 Broker/Trigger 模型, 其實并不複雜。外部事件源将事件發送給 Broker, Broker 接收事件之後發送給對應的 Channel(也就是消息緩存,轉發的地方,如 Kafka,InMemoryChannel 等),通過建立 Trigger 訂閱 Broker 實作事件的訂閱,另外在 Trigger 中定義對應的服務,實作最終的事件驅動服務。

消息隊列 RocketMQ

消息隊列 RocketMQ 版是阿裡雲基于 Apache RocketMQ 建構的低延遲、高并發、高可用、高可靠的分布式消息中間件。消息隊列 RocketMQ 版既可為分布式應用系統提供異步解耦和削峰填谷的能力,同時也具備網際網路應用所需的海量消息堆積、高吞吐、可靠重試等特性。

RocketMQSource 是 Knative 平台的 RocketMQ 事件源。其可以将 RocketMQ 叢集的消息以 Cloud Event 的格式實時轉發到 Knative 平台,是 Apahe RocketMQ 和 Knative 之間的連接配接器。

當 RocketMQ 遇上 Serverless,會碰撞出怎樣的火花?

Knative + RocketMQ 場景示例-餐飲配送場景

當 RocketMQ 遇上 Serverless,會碰撞出怎樣的火花?

我們接下來以餐飲配送為例進行示範,餐飲配送場景具有以下特征:

  • 餐飲配送一天之記憶體在明顯的高峰、低谷;
  • 高峰時間下單量很大。

針對這樣的情況,我們采用消息驅動 Serverless, 在高峰的時候自動擴容資源,在低谷的時候縮減資源,按需使用能極大的提升資源使用率,進而降低成本。

1. 典型架構

當 RocketMQ 遇上 Serverless,會碰撞出怎樣的火花?

如上圖所示,當用餐時間來臨,客戶點餐生成下單消息發送到 RocketMQ, 通過 RocketMQSource 擷取下單消息轉換成事件發送到 Broker,通過 Trigger 訂閱下單事件最終驅動訂單服務生成訂餐單。采用該方案具有以下優勢:

  • 通過 Knative 技術以 RocketMQ 為核心将餐飲配送系統 Serverless 化可以極大程度降低伺服器運維與成本;
  • Knative 的彈性可以幫你輕松應對早、中、晚三餐資源高峰需求;
  • 系統以 RocketMQ 做異步解耦,避免長鍊路調用等問題,提高系統可用性。

2. 操作

部署 Knative

參見阿裡雲容器服務部署 Knative。

部署 RocketMQSource

在 Knative 元件管理中,選擇 RocketMQSource 點選部署。

當 RocketMQ 遇上 Serverless,會碰撞出怎樣的火花?

部署訂單服務

參考示例代碼倉庫。

一鍵部署服務指令如下:

kubectl apply -f 200-serviceaccount.yaml -f 202-clusterrolebinding.yaml -f 203-secret.yaml -f alirocketmqsource.yaml -f broker.yaml -f ksvc-order-service.yaml -f trigger.yaml
           

模拟高峰訂餐下單

通過模拟下單,往 RocketMQ 中并發發送消息即可。消息格式參考:

{"orderId":"123214342","orderStatus":"completed","userPhoneNo":"152122131323","prodId":"2141412","prodName":"test","chargeMoney":"30.0","chargeTime":"1584932320","finishTime":"1584932320"}
           

3. 示範效果

如下圖所示:

當 RocketMQ 遇上 Serverless,會碰撞出怎樣的火花?

其它應用場景

1. Knative + RocketMQ 典型場景 - 建構 Serverless 電商系統

當 RocketMQ 遇上 Serverless,會碰撞出怎樣的火花?
  • Knative 彈性可以幫你輕松應對團購、雙11 等電商的大促活動;
  • 系統以 RocketMQ 為中心做異步解耦,避免長鍊路調用等問題,提高系統可用性。

2. Knative + RocketMQ 典型場景- 建構監控告警平台

當 RocketMQ 遇上 Serverless,會碰撞出怎樣的火花?
  • Metric、Log 等資料通過 RocketMQ 叢集推送到 Knative 服務;
  • Knative 服務通過資料分析将告警内容推送釘釘或 slack 等通訊工具;
  • Knative 服務可以将 Metric 或 logs 資料進行處理,推送第三方系統。

3. Knative + RocketMQ 典型場景- 多資料格式轉換

當 RocketMQ 遇上 Serverless,會碰撞出怎樣的火花?
  • 處理資料日志以生成多個結果派生詞,這些結果派生詞可用于營運,營銷,銷售等;
  • 将内容從一種格式轉換為另一種格式,例如,将 Microsoft Word 轉換為 PDF;
  • 需要轉換為多種格式的主媒體檔案。

總結

通過以上 RocketMQ 事件驅動 Knative Serverless 應用的介紹,是否也給你碰撞出了火花?可以結合自身的應用場景不妨一試,相信會給你帶來不一樣的體驗。

歡迎釘釘掃碼加入交流群

當 RocketMQ 遇上 Serverless,會碰撞出怎樣的火花?

<關注阿裡巴巴雲原生公衆号,回複 Knative 即可下載下傳電子書>

“阿裡巴巴雲原生關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的公衆号。”

繼續閱讀