postgresql , 微服務 , 配置管理 , udf , 異步消息 , json , xml
微服務的介紹,請參考
<a href="https://martinfowler.com/articles/microservices.html">https://martinfowler.com/articles/microservices.html</a>
不管是微服務,或者其他軟體架構,docker等。app(微服務)配置的同步,變更,下發,都是需要面對的。
例如你可以用消息隊列,但是這種方式比較重,同時在app重新開機後,可能還需要消費一部分消息(實際上重新開機後可以直接讀取最新配置,不需要重新消費)。
使用postgresql以及udf可以比較好的解決微服務的配置存儲、變更、下發的問題。
postgresql 支援json, xml, kv, 數組等資料類型,可以非常友善的存儲應用配置。
postgresql提供了一個異步消息的功能,使用者可以往通道中發消息,也可以監聽來自通道的消息。
這種方式比較适合下發配置,例如每個微服務都監聽來自某個通道的消息,當需要變更配置時,往配置變更表插入一條新的配置記錄,同時調用觸發器函數,往通道中發送消息,所有的微服務都會接收到來自該通道的消息。
弊端
1. 每個微服務都需要與postgresql建立一個長連接配接,并監聽某個通道。如果監聽斷開,重建立立連接配接和監聽之前的消息會丢掉。
這個問題可以解,比如連接配接斷開後,重建立立監聽,同時微服務主動詢問一下資料庫(查詢配置表),是否有新的配置。如果有的話自動擷取最新配置資訊。
2. 由于每個微服務都需要占用一個長連接配接,對資料庫來說,幾萬個微服務,就需要幾萬個長連接配接,平均每個連接配接消耗2mb記憶體的話,就需要1萬個連接配接需要20gb記憶體。
notify/listen 異步消息還有其他比較适合的應用場合,例如
<a href="https://github.com/digoal/blog/blob/master/201701/20170116_01.md">《從電波表到資料庫小程式之 - 資料庫異步廣播(notify/listen)》</a>
<a href="https://github.com/digoal/blog/blob/master/201701/20170113_03.md">《從微信小程式 到 資料庫"小程式" , 鬼知道我經曆了什麼》</a>
<a href="https://github.com/digoal/blog/blob/master/201701/20170113_02.md">《[轉載]postgres+socket.io+nodejs實時地圖應用實踐》</a>
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信用卡)公司裡的場景,期待使用者方的詳盡分享。
<a href="https://www.postgresql.org/docs/9.6/static/sql-notify.html">https://www.postgresql.org/docs/9.6/static/sql-notify.html</a>
<a href="https://www.postgresql.org/docs/9.6/static/sql-listen.html">https://www.postgresql.org/docs/9.6/static/sql-listen.html</a>
<a href="https://www.postgresql.org/docs/9.6/static/libpq-notify.html">https://www.postgresql.org/docs/9.6/static/libpq-notify.html</a>