閱讀922 返回首頁    go 技術社區[雲棲]


微服務配置管理

標簽

PostgreSQL , 微服務 , 配置管理 , UDF , 異步消息 , JSON , XML


背景

pic

微服務的介紹,請參考

https://martinfowler.com/articles/microservices.html

不管是微服務,或者其他軟件架構,docker等。APP(微服務)配置的同步,變更,下發,都是需要麵對的。

例如你可以用消息隊列,但是這種方式比較重,同時在APP重啟後,可能還需要消費一部分消息(實際上重啟後可以直接讀取最新配置,不需要重新消費)。

使用PostgreSQL以及UDF可以比較好的解決微服務的配置存儲、變更、下發的問題。

配置存儲

PostgreSQL 支持json, XML, kv, 數組等數據類型,可以非常方便的存儲應用配置。

配置變更通知方法1 - notify, listen

PostgreSQL提供了一個異步消息的功能,用戶可以往通道中發消息,也可以監聽來自通道的消息。

這種方式比較適合下發配置,例如每個微服務都監聽來自某個通道的消息,當需要變更配置時,往配置變更表插入一條新的配置記錄,同時調用觸發器函數,往通道中發送消息,所有的微服務都會接收到來自該通道的消息。

pic

弊端

1. 每個微服務都需要與PostgreSQL建立一個長連接,並監聽某個通道。如果監聽斷開,重新建立連接和監聽之前的消息會丟掉。

這個問題可以解,比如連接斷開後,重新建立監聽,同時微服務主動詢問一下數據庫(查詢配置表),是否有新的配置。如果有的話自動獲取最新配置信息。

2. 由於每個微服務都需要占用一個長連接,對數據庫來說,幾萬個微服務,就需要幾萬個長連接,平均每個連接消耗2MB內存的話,就需要1萬個連接需要20GB內存。

notify/listen 異步消息還有其他比較適合的應用場合,例如

《從電波表到數據庫小程序之 - 數據庫異步廣播(notify/listen)》

《從微信小程序 到 數據庫"小程序" , 鬼知道我經曆了什麼》

《[轉載]postgres+socket.io+nodejs實時地圖應用實踐》

配置變更通知方法2 - UDF

PostgreSQL 還有trigger以及UDF的功能,如果用在微服務的配置管理場景,相比異步消息,沒有以上兩個問題。

pic

怎麼做到呢?

1. 微服務的注冊,例如為每個微服務注冊後,在數據庫中表現為一條唯一身份的記錄(微服務的指紋)。

2. 微服務注冊後,啟動服務時,從配置表讀取最新的配置。

3. 當下發配置時,往配置表插入一條記錄(或者更新配置記錄),我們暫且將配置的ID表示為NEW ID,老的配置為OLD ID,然後通過DML trigger,觸發調用一個UDF。

4. 這個UDF可以是PostgreSQL pljava, plpython, C等過程語言編寫的觸發器函數,UDF的目標是根據已注冊的微服務,聯係並把配置變更涉及的ID或者內容直接發送給微服務,如果是發送ID,微服務還需要訪問數據庫,讀取對應的配置。

弊端

1. 由於是數據庫通過UDF主動通知服務的,所以微服務必須有對應的API,增加了微服務的複雜度。

小結

PostgreSQL 的異步消息機製、觸發器、UDF接口等功能,結合json, xml, kv, 數組等類型。可以很好的解決微服務的配置管理問題。

這個應用場景的靈感來自PG社區的同學(51信用卡)公司裏的場景,期待用戶方的詳盡分享。

參考

https://www.postgresql.org/docs/9.6/static/sql-notify.html

https://www.postgresql.org/docs/9.6/static/sql-listen.html

https://www.postgresql.org/docs/9.6/static/libpq-notify.html

最後更新:2017-04-10 20:02:47

  上一篇:go 時序數據庫分析 - TimescaleDB時序數據庫介紹
  下一篇:go 多點最優路徑規劃 - (商旅問題,拚車,餐飲配送,包裹配送,包裹取件,回程單)