開發與維運

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

1.png

作者 | 元毅  阿里巴巴高級開發工程師

阿里巴巴雲原生公眾號後臺回覆 Knative,免費下載《Knative 雲原生應用開發指南》電子書!

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

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

雲原生

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

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

2.png

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

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

Serverless

3.png

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。

4.png

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。

5.png

2. Serverless 服務引擎 - Serving

6.png

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

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

Serving 應用模型

7.png

  • Service: 對應用 Serverless 編排的抽象,通過 Service 管理應用的生命週期;
  • Configuration: 當前期望狀態的配置。每次更新 Service 就會更新 Configuration;
  • Revision: configuration 的每次更新都會創建一個快照,用來做版本管理;
  • Route: 將請求路由到 Revision,並可以向不同的 Revision 轉發不同比例的流量。

3. 事件驅動框架 - Eventing

8.png

1.採用 CloudEvent 作為事件傳輸協議: CloudEvent 以通用的格式描述事件數據,提供跨平臺的服務交互能力。KnativeEventing 使用 CloudEvent 作為事件傳輸標準,極大的提升了應用的跨平臺可移植性;
2.外部事件源接入和註冊: 提供 Github、RocketMQ 以及 Kafka 等事件源的支持,當然用戶可以自定義事件源。
3.事件的訂閱和觸發:引入 Broker 和 Trigger 模型意義,不僅將事件複雜的處理實現給用戶屏蔽起來,更提供豐富的事件訂閱、過濾機制;
4.兼容現有消息系統:KnativeEventing 充分解耦了消息系統的實現,目前除了系統自身支持的基於內存的消息通道 InMemoryChannel 之外,還支持 Kafka、NATSStreaming 等消息服務,此外可以方便的對接現有的消息系統。

Eventing 中 Broker/Trigger模型

9.png

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

消息隊列 RocketMQ

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

RocketMQSource

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

10.png

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

11.png

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

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

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

1. 典型架構

12.png

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

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

2. 操作

部署 Knative

參見阿里雲容器服務部署 Knative

部署 RocketMQSource

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

13.png

部署訂單服務

參考示例代碼倉庫

一鍵部署服務命令如下:

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. 演示效果

如下圖所示:

14.png

其它應用場景

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

15.png

  • Knative 彈性可以幫你輕鬆應對團購、雙11 等電商的大促活動;
  • 系統以 RocketMQ 為中心做異步解耦,避免長鏈路調用等問題,提高系統可用性。

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

16.png

  • Metric、Log 等數據通過 RocketMQ 集群推送到 Knative 服務;
  • Knative 服務通過數據分析將告警內容推送釘釘或 slack 等通訊工具;
  • Knative 服務可以將 Metric 或 logs 數據進行處理,推送第三方系統。

3. Knative + RocketMQ 典型場景- 多數據格式轉換

17.png

  • 處理數據日誌以生成多個結果派生詞,這些結果派生詞可用於運營,營銷,銷售等;
  • 將內容從一種格式轉換為另一種格式,例如,將 Microsoft Word 轉換為 PDF;
  • 需要轉換為多種格式的主媒體文件。

總結

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

歡迎釘釘掃碼加入交流群

18.png

<關注阿里巴巴雲原生公眾號,回覆 Knative 即可下載電子書>

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

Leave a Reply

Your email address will not be published. Required fields are marked *