922
技術社區[雲棲]
微服務配置管理
標簽
PostgreSQL , 微服務 , 配置管理 , UDF , 異步消息 , JSON , XML
背景
微服務的介紹,請參考
https://martinfowler.com/articles/microservices.html
不管是微服務,或者其他軟件架構,docker等。APP(微服務)配置的同步,變更,下發,都是需要麵對的。
例如你可以用消息隊列,但是這種方式比較重,同時在APP重啟後,可能還需要消費一部分消息(實際上重啟後可以直接讀取最新配置,不需要重新消費)。
使用PostgreSQL以及UDF可以比較好的解決微服務的配置存儲、變更、下發的問題。
配置存儲
PostgreSQL 支持json, XML, kv, 數組等數據類型,可以非常方便的存儲應用配置。
配置變更通知方法1 - notify, listen
PostgreSQL提供了一個異步消息的功能,用戶可以往通道中發消息,也可以監聽來自通道的消息。
這種方式比較適合下發配置,例如每個微服務都監聽來自某個通道的消息,當需要變更配置時,往配置變更表插入一條新的配置記錄,同時調用觸發器函數,往通道中發送消息,所有的微服務都會接收到來自該通道的消息。
弊端
1. 每個微服務都需要與PostgreSQL建立一個長連接,並監聽某個通道。如果監聽斷開,重新建立連接和監聽之前的消息會丟掉。
這個問題可以解,比如連接斷開後,重新建立監聽,同時微服務主動詢問一下數據庫(查詢配置表),是否有新的配置。如果有的話自動獲取最新配置信息。
2. 由於每個微服務都需要占用一個長連接,對數據庫來說,幾萬個微服務,就需要幾萬個長連接,平均每個連接消耗2MB內存的話,就需要1萬個連接需要20GB內存。
notify/listen 異步消息還有其他比較適合的應用場合,例如
《從電波表到數據庫小程序之 - 數據庫異步廣播(notify/listen)》
《從微信小程序 到 數據庫"小程序" , 鬼知道我經曆了什麼》
《[轉載]postgres+socket.io+nodejs實時地圖應用實踐》
配置變更通知方法2 - UDF
PostgreSQL 還有trigger以及UDF的功能,如果用在微服務的配置管理場景,相比異步消息,沒有以上兩個問題。
怎麼做到呢?
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