IoT平台如何實現業務配置中心
摘要:本文講述業務配置中心(下文簡述為配置中心)的關鍵技術和實現方式。
本文分享自華為雲社區《手把手教你物聯網平台如何實現業務配置中心》,作者: 華為雲IoT專家團 。
上一篇《華為雲物聯網高級攻城獅的4年配置中心實踐分享》文章中分享了業務配置中心。
本文講述業務配置中心(下文簡述為配置中心)的關鍵技術和實現方式。華為雲物聯網平台按照本文的實現方式實現了一個業務配置中心,該配置中心2020年1月上線,平穩運行至今。
1 概念
1.1 運維配置
和用戶無關,通常為集群界級別的配置,程序只會進行讀取,如數據庫配置、郵箱服務器配置、網卡配置、子網地址配置等。
1.2 業務配置
作為SaaS 服務,每個用戶在上面都有一些業務配置。如用戶的證書配置、用戶服務器的流控配置等,這些業務配置相對運維配置來說更加複雜,且可能會有唯一性限制,如按用戶 id 唯一。這部分配置數據一般由用戶操作觸發,代碼動態寫入,並且通知到各個微服務實例。通常,我們希望這些配置能在界面展示,且支持人為修改。上述邏輯如果由各微服務自己實現,會存在大量重複代碼,並且質量無法保證。我們希望由一個公共組件來統一實現這個能力。開源或體量較小的項目就不會選擇依賴一個配置中心,而是直接通過連接數據庫或etcd來解決問題。
1.3 env
代表一個部署環境。
1.4 cluster
代表環境下的集群。常見於單環境下藍綠發佈,藍集群、綠集群、金絲雀集群等。
1.5 配置
配置名稱,如用戶證書配置、用戶流控配置等。
1.6 Key
配置的唯一鍵,如用戶id。
1.7 Value
配置唯一鍵對應的值。
2 配置中心設計梗概
2.1 業務配置特點
- 雖然業務配置寫入可能存在並發,但並發量不大,頻率較低。
- 業務配置常常以用戶為id,單集群用戶量有限,一般不超過5萬。
2.2 配置中心要解決的問題
2.3 設計要點
- 單配置要求有配置id,每個id上通過version的樂觀並發控制來解決多版本衝突問題
- 通知不追求可靠,應用程序和配置中心斷鏈無法接收通知的場景下,通過定期同步數據來保證數據的可靠
- 支持Schema的變更,因Schema變更不頻繁,也採用version的樂觀並發控制來解決多版本衝突問題
2.4 通知是否包含消息內容
我認為應該只通知Key,具體的數值讓應用程序再去配置中心查詢。僅通知Key實現簡潔易懂。同時通知Key&Value需要多考慮定期同步和通知兩條通道並發,可能引起的競態衝突。
3 配置中心業務流程
本小節描述業務配置中心的所有業務流程,並試圖從交互中抽象出與具體實現無關的接口
3.1配置的增刪改查
3.2 配置值的增刪改查
3.3 定期同步
分佈式場景下,通知有可能無法送達,如程序陷入網絡中斷(或長gc),通知消息送達超時,待程序恢復後,數據不再準確。因此需要對數據做定期同步,提高可靠性。
同步過程中,僅僅請求交互id和version,避免傳輸大量數據。應用程序接收到需要同步的數據後:
- 刪除操作,觸發刪除通知,從本地緩存中移除數據。
- 添加、修改操作,向配置中心查詢最新數據,觸發通知並寫入本地緩存。
3.4 服務啟動
服務啟動也可看做是一個同步的流程,只是需要同步大量的數據添加。為了避免向配置中心頻繁大量的請求,引入批量操作來減輕壓力
3.5 限制
該配置中心設計思路依賴客戶端可把數據全量放入到內存中,如用戶量太大,則不適合採用這種模式。
註:一個節省內存的思路是,內存中只放置全量的id和version,數據只有當用到的時候再去查詢。這個思路要求配置中心持久化一些老舊數據以供以下場景的查詢使用
- 業務流程中,需要使用該配置值的。
- 回調業務程序修改的時候,需要提供舊值的。
除此之外沒有任何區別。
4 業務配置抽象實現
從上述描述的業務場景,我們抽象出業務配置中心的交互接口和抽象實現。接口的Swagger Yaml已上傳到Github://github.com/Shoothzj/config-center/tree/master/swagger
4.1配置相關接口
- 提供env、cluster、配置名稱、配置Schema、配置版本號添加配置
- 提供env、cluster、配置名稱刪除配置
- 提供env、cluster、配置名稱、新Schema、新Version來修改配置
- 提供env、cluster、配置名稱來查詢配置
4.2 配置值相關接口
- 提供env、cluster、配置名稱、Key、Value來添加配置值
- 提供env、cluster、Key、ValueVersion(可選)來刪除配置值
- 提供env、cluster、Key、Value、ValueVersion(可選)修改配置值
- 提供env、cluster、Key查詢配置值
- 根據env、cluster、應用程序當前的配置數據來做定期同步
- 根據Key列表批量查詢配置值
4.3 通知相關接口
- 通知某env某cluster下,配置項中的一個Key發生變化,新增、修改或是刪除。可選方式有HTTP長鏈接(Inspired by Apollo)、Mqtt、WebSocket等。
4.4 配置中心存儲層抽象實現
配置中心存儲層需要存儲配置和配置值數據,支持UpdateByVersion,且需要捕捉數據的變化,用來通知到應用程序
4.5 服務發現抽象實現
為了使應用程序連接到配置中心,需要一個發現機制可以讓應用程序感知到配置中心的地址。高可用的方式很多,如K8s發現、ZooKeeper、Etcd、ServiceComb、業務環境變量注入ELB地址(ELB後端掛載配置中心的地址)等。
4.6 抽象總結
根據這個抽象,我們可以進行關鍵技術點選型,來實現業務配置中心。
5 配置中心實現
5.1 華為雲物聯網配置中心實現
- env+cluster+config組成數據表的名稱
- 一個key、value對應一行數據
5.2 另一種實現方式
只要實現上述接口和抽象能力,都可以實現業務配置中心,也可以這麼實現
- env+cluster+config+key 組合成etcd的key
- 一個key、value對應一個鍵值對
5.3 又一種實現方式
當然也可以
- env+cluster+config+key 組合成RocksDB的key
- 一個key、value對應一個鍵值對