NBF事件中心架构设计与实现
簡介:NBF是阿里巴巴供應鏈中臺的基礎技術團隊打造的一個技術PaaS平臺,她提供了微服務FaaS框架,低代碼平臺和中臺基礎設施等一系列的PaaS產品,旨在幫助業(yè)務伙伴快速復用和擴展中臺能力,提升研發(fā)效能和對外的商業(yè)化輸出。事件中心就是NBF系列技術產品中的一員。本文首先介紹事件驅動架構的概念及適用場景,然后會介紹事件中心產品的設計和實現。
作者 | 林暉
 來源 | 阿里技術公眾號
一 業(yè)務背景
電商平臺供應鏈的業(yè)務場景非常復雜,技術中臺需要支持非常復雜且不斷變化的業(yè)務需求,構建了數量繁多且緊密耦合的業(yè)務鏈路,為技術架構的維護帶來了壓力。
1 問題描述
上圖是一個典型的業(yè)務架構,A域是上游域,B域和C域是下游域。A域在收到外部調用請求時,首先同步調用B域的服務接口完成同步業(yè)務邏輯,然后發(fā)送消息通知到MQ。C域異步消費消息后,反向調用A域的接口查詢詳細信息,完成異步業(yè)務邏輯。
這種架構的問題包括:
面對這些問題,我們希望應用事件驅動架構的特性來解耦子域,降低業(yè)務鏈路復雜度,構建穩(wěn)定并向前兼容的事件契約,從而提升全域的穩(wěn)定性。
2 事件驅動架構的應用過程
3 關于NBF
NBF[1] 是阿里巴巴供應鏈中臺的基礎技術團隊打造的一個技術PaaS平臺,全稱是New-Retail Business Factory,她提供了微服務FaaS框架,低代碼平臺和中臺基礎設施等一系列的PaaS產品,旨在幫助業(yè)務伙伴快速復用和擴展中臺能力,提升研發(fā)效能和對外的商業(yè)化輸出。事件中心就是NBF系列技術產品中的一員。
本文首先介紹事件驅動架構的概念及適用場景,然后會介紹事件中心產品的設計和實現。
二 什么是事件驅動架構(EDA)
1 領域事件
很多同學會將事件和消息混淆。在業(yè)務系統(tǒng)中,事件指的是領域事件,而消息可以是任意數據或數據片段。領域事件的特點包括:
2 事件驅動架構的概念
和很多架構名詞類似,事件驅動架構并沒有一個明確的定義和能力范圍。Martin Fowler在2017年的文章[2] 中描述了與事件驅動架構相關的一些主要模式。在本文中,事件驅動架構的概念具象為由領域事件驅動的業(yè)務流技術架構。每一個領域事件都對應一個業(yè)務流中的具體活動(如采購單建單),而事件就是活動發(fā)生導致的結果(如采購單建單完成事件),事件內容就是活動導致的完整狀態(tài)變化(如采購單+子單列表)。
3 事件驅動架構的優(yōu)點
在Fundamentals of Software Architecture[3] 以及Microservices Patterns[4]等書中描述了事件驅動架構的一些明顯特點,我們總結為以下幾項:
4 事件驅動架構能解決什么實際問題
下面我們舉幾個例子來描述事件驅動架構的解耦和廣播能力如何幫助解決現實工作中的問題:
解耦能力
在基于請求/響應方式的服務化架構中,上游服務按照約定的RPC接口調用下游服務,這樣有一個比較嚴重的問題:上游服務作為數據(例如業(yè)務單據)的生產者,強依賴了作為數據消費方的下游服務所定義的接口,導致上游服務自身無法沉淀接口和數據標準。
一種更合理的方案是依賴倒置:由上游服務定義SPI,下游服務實現SPI,這樣,上游服務終于有機會沉淀出自身的接口和數據標準,不再需要適配各個下游服務的接口,而是由下游服務的開發(fā)者按照接口文檔來做實現。但這種設計仍然無法解決運行時上游服務仍然依賴下游服務的問題,下游服務的可用性、一致性、冪等性能力會直接影響上游服務的相關指標及實現方式,需要上下游服務開發(fā)者一起對齊方案,在出問題時一起解決。
使用事件驅動設計可以實現契約定義和運行時的全面解耦:上游服務可以沉淀自己的事件契約,在運行時無論是上游服務還是下游服務都只依賴事件Broker,下游服務的可用性和一致性等問題由事件Broker來保障。
廣播能力
在供應鏈中臺這樣復雜的微服務架構中,關鍵的上游服務往往有多個下游服務,上游服務一般需要順序或并發(fā)調用所有的下游服務來完成一次完整的調用。
上游服務的開發(fā)者會面臨多個難題:
而下游服務的開發(fā)者也有自己的問題:
使用事件驅動架構天然可以避免上述問題:
5 事件驅動架構不適合什么場景
三 事件中心的功能設計
作為面向中臺的事件中間件,事件中心集成了消息中間件MetaQ(RocketMQ),初始使用體感也與MQ很像,但事件中心有很多不同的功能設計:
四 事件中心的運行時架構
事件中心運行態(tài)主要由以下部分組成:
1、事件中心服務/SDK
a) SDK:包含事件收發(fā)的主要邏輯,支持事務發(fā)送和普通發(fā)送,支持事件校驗、壓縮、本地備份;
b) Tunnel Service:一層很薄的數據庫代理服務,支持按應用、事件、場景、IO維度的限流,支持數據庫快速靈活擴容;
c) Index Service:事件索引服務,通過精衛(wèi)(DataX)獲取Binlog,解析為索引后寫入索引表(Lindorm)。
2、阿里中間件
a) Diamond(Nacos):包含應用相關的全部配置信息,如發(fā)送、訂閱關系、事件定義、中間件配置等;
b) SchedulerX:調度SDK執(zhí)行事件重新發(fā)送、重新消費、事務異常狀態(tài)問詢;
c) MetaQ:主要的事件收發(fā)管道;
d) TDDL(RDS):事件內容及消費記錄存儲;
e) 精衛(wèi):用于生成索引、計算延遲等異步處理邏輯;
f) Lindrom(serverless):用于存放事件外部索引,serverless模式支持按量付費和彈性擴容,性能比較穩(wěn)定。
下圖為簡化的運行時架構圖,圖中藍色線條表示事件的正常收發(fā)鏈路(事務發(fā)送),紅色線條表示事件的異常處理鏈路。
1 事件發(fā)送與消費流程
事件結構
運行時的一條事件實例由三部分組成:
1、事件ID:全局唯一,格式為“邏輯庫編號_月內發(fā)送日期_uuid”,例如01_11_f75ec4fb347c49c4bc3e93xxxxxxxx,其中邏輯庫編號用于邏輯庫路由,日期用于事件清理;
2、事件Head:包含事件元信息,如trace信息、發(fā)送者信息、事件大小、MetaQ信息等,參考示例:
3、事件Body:JSON格式,包含由用戶已定義的事件內容,事件內容要符合事件定義契約,否則會被拒絕發(fā)送。
運行時的事件可能有多個消費方,每個消費方會產生一條消費記錄,消費記錄包含:
- 事件ID
- 消費信息:消費狀態(tài)、消費次數、下次消費時間等
事件發(fā)送流程
事件中心支持事務發(fā)送和非事務發(fā)送兩種模式,使用狀態(tài)機驅動,API設計與MetaQ的API基本一致。以下以事務發(fā)送為例介紹發(fā)送流程,由于非事務發(fā)送的流程更簡單,所以不再詳細介紹。
1)事務發(fā)送狀態(tài)機
2)事務發(fā)送時序圖
3)異常狀態(tài)事務問詢
事件消費流程
事件消費流程也使用狀態(tài)機驅動,API相比MetaQ有一些不同:
1)事件消費狀態(tài)機
2)重試周期
事件進入消費失敗狀態(tài)后,事件中心會周期調用用戶Listener重新消費,消費周期以5s起始指數增加,最多重試15次,最大為5 * 214 = 81920秒(約22小時)。
3)事件消費時序圖
2 事件存儲
數據表
事件中心使用了32分庫的TDDL,按照HASH(事件ID)做分庫,每個庫上有以下幾張表:
事件生命周期
3 外部索引
事件發(fā)送歷史列表、事件索引查詢和事件重投是事件中心運維平臺的主要功能。其中索引查詢功能的查詢速度快、查詢結果準確,用戶反饋一直比較好。
索引配置
用戶在修改事件定義時,可以為其中任意基礎類型字段配置為“查詢字段”,事件中心會在運行時解析該字段的值,并創(chuàng)建索引;一個事件中的每個查詢字段都會對應一條索引;即使沒有配置查詢字段,也會生成一條包含時間戳的索引,用于已發(fā)送事件的排序和分頁。
索引結構
事件中心的索引為KV結構,使用Lindorm的寬表存儲,按使用場景分為兩種類型:
其中
查詢性能
通過目前事件中心運維平臺99%的查詢都可以在毫秒級別返回結果,Lindorm索引行數在十億級別。
五 總結
本文介紹了事件驅動架構在供應鏈執(zhí)行鏈路的應用背景和實踐過程,并介紹了NBF事件中心產品的設計和部分實現。目前事件中心每日事件發(fā)送量峰值在千萬級別,平穩(wěn)度過了雙11、雙12、年貨節(jié)等流量高峰。
原文鏈接
本文為阿里云原創(chuàng)內容,未經允許不得轉載。?
總結
以上是生活随笔為你收集整理的NBF事件中心架构设计与实现的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 2022,你的团队距离持续部署还有多远?
- 下一篇: 使用 Flink Hudi 构建流式数据
