当 RocketMQ 遇上 Serverless,会碰撞出怎样的火花?
作者 | 元毅? 阿里巴巴高級開發(fā)工程師
阿里巴巴云原生公眾號后臺回復(fù)?Knative,免費(fèi)下載《Knative 云原生應(yīng)用開發(fā)指南》電子書!
想必大家都比較了解 RocketMQ 消息服務(wù),那么 RocketMQ 與 Serverless 結(jié)合會碰撞出怎樣的火花呢?我們今天介紹一下如何基于 RocketMQ + Knative 驅(qū)動云原生 Serverless 應(yīng)用 。本文主要從以下幾個方面展開介紹:
- 云原生與 Serverless
- Knative 簡介
- RocketMQSource
- 餐飲配送場景示例
云原生
先看一下 CNCF 對云原生的定義:
云原生技術(shù)有利于各組織在公有云、私有云和混合云等新型動態(tài)環(huán)境中,構(gòu)建和運(yùn)行可彈性擴(kuò)展的應(yīng)用。云原生的代表技術(shù)包括容器、服務(wù)網(wǎng)格、微服務(wù)、不可變基礎(chǔ)設(shè)施和聲明式 API。
這些技術(shù)能夠構(gòu)建容錯性好、易于管理和便于觀察的松耦合系統(tǒng)。結(jié)合可靠的自動化手段,云原生技術(shù)使工程師能夠輕松地對系統(tǒng)作出頻繁和可預(yù)測的重大變更。
其實云原生旨在以標(biāo)準(zhǔn)化云服務(wù)的提供方式銜接云廠商和客戶。這種方式對于客戶而言降低了上云和跨云遷移的成本,讓客戶始終保有和云廠商議價的能力;對云廠商而言,因為客戶跨云遷移的成本低,所以只要能提供性價比更高的云服務(wù),就能很容易的聚集大量用戶。
Serverless
Serverless(無服務(wù)器架構(gòu))是指服務(wù)端邏輯由開發(fā)者實現(xiàn),運(yùn)行在無狀態(tài)的計算容器中,由事件觸發(fā),完全被第三方管理,其業(yè)務(wù)層面的狀態(tài)則存儲在數(shù)據(jù)庫或其他介質(zhì)中。
Serverless 可以理解為云原生技術(shù)發(fā)展的高級階段,使開發(fā)者更聚焦在業(yè)務(wù)邏輯,而減少對基礎(chǔ)設(shè)施的關(guān)注。
這里提到的是 Functions Serverless, 其實除了 Functions Serverless, 還有另外一種 Serverless 形態(tài):容器化的Serverless。相較于 Function Serverless,容器化的 Serverless, 可移植性更強(qiáng), 開發(fā)者對復(fù)雜應(yīng)用程序能進(jìn)行更好的掌控。除此之外,對于那些經(jīng)歷過容器時代洗禮的用戶,容器化的 serverless或許是一種更好的選擇。
對于Serverless, 有如下幾點(diǎn)需要關(guān)注一下:
- 事件(event)驅(qū)動:Serverless 是由事件(event)驅(qū)動(例如 HTTP、pub/sub)的全托管計算服務(wù);
- 自動彈性:按需使用,削峰填谷;
- 按使用量計費(fèi):相對于傳統(tǒng)服務(wù)按照使用的資源(ECS 實例、VM 的規(guī)格等)計費(fèi),Serverless 場景下更多的是按照服務(wù)的使用量(調(diào)用次數(shù)、時長等)計費(fèi);
- 綠色的計算: 所謂綠色的計算其實就是最大化的提升資源使用效率,減少資源浪費(fèi),做的“節(jié)能減排”。
Knative
上面提到了容器化的 Serverless,那么有沒有這樣的 Serveless 平臺框架呢?答案就是:Knative。
Knative 是在 2018 的 Google Cloud Next 大會上發(fā)布的一款基于 Kubernetes 的 Serverless 編排引擎。Knative 一個很重要的目標(biāo)就是制定云原生、跨平臺的 Serverless 編排標(biāo)準(zhǔn)。Knative 是通過整合容器構(gòu)建(或者函數(shù))、工作負(fù)載管理(彈性)以及事件模型這三者來實現(xiàn)的這一 Serverless 標(biāo)準(zhǔn)。Knative 社區(qū)的當(dāng)前主要貢獻(xiàn)者有 Google、Pivotal、IBM、RedHat。另外像 CloudFoundry、OpenShift 這些 PaaS 提供商都在積極的參與 Knative 的建設(shè)。
1. Knative 核心模塊
Knative 核心模塊主要包括事件驅(qū)動框架 Eventing 和部署工作負(fù)載的 Serving。
2. Serverless 服務(wù)引擎 - Serving
Knative Serving 核心能力就是其簡潔、高效的應(yīng)用托管服務(wù),這也是其支撐 Serverless 能力的基礎(chǔ)。Knative 提供的應(yīng)用托管服務(wù)可以大大降低直接操作 Kubernetes 資源的復(fù)雜度和風(fēng)險,提升應(yīng)用的迭代和服務(wù)交付效率。當(dāng)然作為 Severlesss Framework 就離不開按需分配資源的能力,阿里云容器服務(wù) Knative 可以根據(jù)您應(yīng)用的請求量在高峰時期自動擴(kuò)容實例數(shù),當(dāng)請求量減少以后自動縮容實例數(shù),可以非常自動化的幫助您節(jié)省成本。
Serving 通過與 Istio 結(jié)合還提供了強(qiáng)大的流量管理能力和靈活的灰度發(fā)布能力。流量管理能力可以根據(jù)百分比切分流量,灰度發(fā)布能力可以根據(jù)流量百分比進(jìn)行灰度,同時灰度發(fā)布能力還能通過自定義 tag 的方式進(jìn)行上線前的測試,非常便于和自己的 CICD 系統(tǒng)集成。
Serving 應(yīng)用模型
- Service: 對應(yīng)用 Serverless 編排的抽象,通過 Service 管理應(yīng)用的生命周期;
- Configuration: 當(dāng)前期望狀態(tài)的配置。每次更新 Service 就會更新 Configuration;
- Revision: configuration 的每次更新都會創(chuàng)建一個快照,用來做版本管理;
- Route: 將請求路由到 Revision,并可以向不同的 Revision 轉(zhuǎn)發(fā)不同比例的流量。
3. 事件驅(qū)動框架 - Eventing
1.采用 CloudEvent 作為事件傳輸協(xié)議: CloudEvent 以通用的格式描述事件數(shù)據(jù),提供跨平臺的服務(wù)交互能力。KnativeEventing 使用 CloudEvent 作為事件傳輸標(biāo)準(zhǔn),極大的提升了應(yīng)用的跨平臺可移植性;
2.外部事件源接入和注冊: 提供 Github、RocketMQ 以及 Kafka 等事件源的支持,當(dāng)然用戶可以自定義事件源。
3.事件的訂閱和觸發(fā):引入 Broker 和 Trigger 模型意義,不僅將事件復(fù)雜的處理實現(xiàn)給用戶屏蔽起來,更提供豐富的事件訂閱、過濾機(jī)制;
4.兼容現(xiàn)有消息系統(tǒng):KnativeEventing 充分解耦了消息系統(tǒng)的實現(xiàn),目前除了系統(tǒng)自身支持的基于內(nèi)存的消息通道 InMemoryChannel 之外,還支持 Kafka、NATSStreaming 等消息服務(wù),此外可以方便的對接現(xiàn)有的消息系統(tǒng)。
Eventing 中 Broker/Trigger模型
這里介紹一下 Eventing 中 Broker/Trigger 模型, 其實并不復(fù)雜。外部事件源將事件發(fā)送給 Broker, Broker 接收事件之后發(fā)送給對應(yīng)的 Channel(也就是消息緩存,轉(zhuǎn)發(fā)的地方,如 Kafka,InMemoryChannel 等),通過創(chuàng)建 Trigger 訂閱 Broker 實現(xiàn)事件的訂閱,另外在 Trigger 中定義對應(yīng)的服務(wù),實現(xiàn)最終的事件驅(qū)動服務(wù)。
消息隊列 RocketMQ
消息隊列 RocketMQ 版是阿里云基于 Apache RocketMQ 構(gòu)建的低延遲、高并發(fā)、高可用、高可靠的分布式消息中間件。消息隊列 RocketMQ 版既可為分布式應(yīng)用系統(tǒng)提供異步解耦和削峰填谷的能力,同時也具備互聯(lián)網(wǎng)應(yīng)用所需的海量消息堆積、高吞吐、可靠重試等特性。
RocketMQSource
RocketMQSource 是 Knative 平臺的 RocketMQ 事件源。其可以將 RocketMQ 集群的消息以 Cloud Event 的格式實時轉(zhuǎn)發(fā)到 Knative 平臺,是 Apahe RocketMQ 和 Knative 之間的連接器。
Knative + RocketMQ 場景示例-餐飲配送場景
我們接下來以餐飲配送為例進(jìn)行演示,餐飲配送場景具有以下特征:
- 餐飲配送一天之內(nèi)存在明顯的高峰、低谷;
- 高峰時間下單量很大。
針對這樣的情況,我們采用消息驅(qū)動 Serverless, 在高峰的時候自動擴(kuò)容資源,在低谷的時候縮減資源,按需使用能極大的提升資源使用率,從而降低成本。
1. 典型架構(gòu)
如上圖所示,當(dāng)用餐時間來臨,客戶點(diǎn)餐生成下單消息發(fā)送到 RocketMQ, 通過 RocketMQSource 獲取下單消息轉(zhuǎn)換成事件發(fā)送到 Broker,通過 Trigger 訂閱下單事件最終驅(qū)動訂單服務(wù)生成訂餐單。采用該方案具有以下優(yōu)勢:
- 通過 Knative 技術(shù)以 RocketMQ 為核心將餐飲配送系統(tǒng) Serverless 化可以極大程度降低服務(wù)器運(yùn)維與成本;
- Knative 的彈性可以幫你輕松應(yīng)對早、中、晚三餐資源高峰需求;
- 系統(tǒng)以 RocketMQ 做異步解耦,避免長鏈路調(diào)用等問題,提高系統(tǒng)可用性。
2. 操作
部署 Knative
參見阿里云容器服務(wù)部署 Knative。
部署 RocketMQSource
在 Knative 組件管理中,選擇 RocketMQSource 點(diǎn)擊部署。
部署訂單服務(wù)
參考示例代碼倉庫。
一鍵部署服務(wù)命令如下:
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 中并發(fā)發(fā)送消息即可。消息格式參考:
{"orderId":"123214342","orderStatus":"completed","userPhoneNo":"152122131323","prodId":"2141412","prodName":"test","chargeMoney":"30.0","chargeTime":"1584932320","finishTime":"1584932320"}3. 演示效果
如下圖所示:
其它應(yīng)用場景
1. Knative + RocketMQ 典型場景 - 構(gòu)建 Serverless 電商系統(tǒng)
- Knative 彈性可以幫你輕松應(yīng)對團(tuán)購、雙11 等電商的大促活動;
- 系統(tǒng)以 RocketMQ 為中心做異步解耦,避免長鏈路調(diào)用等問題,提高系統(tǒng)可用性。
2. Knative + RocketMQ 典型場景- 構(gòu)建監(jiān)控告警平臺
- Metric、Log 等數(shù)據(jù)通過 RocketMQ 集群推送到 Knative 服務(wù);
- Knative 服務(wù)通過數(shù)據(jù)分析將告警內(nèi)容推送釘釘或 slack 等通訊工具;
- Knative 服務(wù)可以將 Metric 或 logs 數(shù)據(jù)進(jìn)行處理,推送第三方系統(tǒng)。
3. Knative + RocketMQ 典型場景- 多數(shù)據(jù)格式轉(zhuǎn)換
- 處理數(shù)據(jù)日志以生成多個結(jié)果派生詞,這些結(jié)果派生詞可用于運(yùn)營,營銷,銷售等;
- 將內(nèi)容從一種格式轉(zhuǎn)換為另一種格式,例如,將 Microsoft Word 轉(zhuǎn)換為 PDF;
- 需要轉(zhuǎn)換為多種格式的主媒體文件。
總結(jié)
通過以上 RocketMQ 事件驅(qū)動 Knative Serverless 應(yīng)用的介紹,是否也給你碰撞出了火花?可以結(jié)合自身的應(yīng)用場景不妨一試,相信會給你帶來不一樣的體驗。
歡迎釘釘掃碼加入交流群
<關(guān)注阿里巴巴云原生公眾號,回復(fù)?Knative?即可下載電子書>
“阿里巴巴云原生關(guān)注微服務(wù)、Serverless、容器、Service Mesh 等技術(shù)領(lǐng)域、聚焦云原生流行技術(shù)趨勢、云原生大規(guī)模的落地實踐,做最懂云原生開發(fā)者的公眾號。”
總結(jié)
以上是生活随笔為你收集整理的当 RocketMQ 遇上 Serverless,会碰撞出怎样的火花?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Serverless 解惑——函数计算如
- 下一篇: 如何使用 Istio 进行多集群部署管理