因爲微服務技術發展迅猛,在咱們的架構中,每一個微服務都會相應的對接一個數據庫,各個數據庫之間有關聯的表(好比用戶表、業務表等)會互相同步數據,其餘的數據操做各自獨立(如日誌表、操做表等),這麼設計是基於性能考慮下降數據庫容量及盡最大努力避免性能遭遇瓶頸。這麼設計對於container來講確實是極友好的,在平常運維中,好比每個月/季度的數據彙總就難受了,身爲DBA,處理跨表查詢應該是小case,然而在hibernate跨表查詢中,雖然麻煩但仍是啃一下仍是能夠解決的。然而最近接到的需求倒是要,跨!庫!聯!查!
我在想微服務的背景下,跨庫查詢應該是新常態mysql
單庫時,系統中不少列表和詳情頁所需數據能夠簡單經過SQL join關聯表查詢;然而多庫狀況下,數據可能分佈在不一樣的節點/實例上,不能跨庫使用join,此時join帶來的問題就很棘手了。web
咱們在開發過程當中,鏈接數據庫一個鏈接也是隻能連一個數據庫這個是常規操做,例如sql
db1 = pymysql.connect("11.22.33.44", "yerik", "mimajiubiekanla", "shujukuming1", port=3306)
若是咱們要查詢另外一個數據庫呢?不就要,再創建一個鏈接嘛數據庫
db2 = pymysql.connect("55.66.77.88", "yerik", "mimajiubiekanla", "shujukuming2", port=3306)
這個怎麼可能用join操做,可能有讀者想要槓一下,說,能夠經過xx操做在代碼層面進行開發,可是,這樣的代碼可讀性有多強?另外就代碼審查來講,也不會讓你這麼寫,萬一某一天你甩鍋離職了,這天花亂墜的代碼,誰受得了?
不過嘛,辦法總比困難多的——視圖。利用視圖,咱們能夠很是簡單的實現這樣的跨庫查詢的需求。咱們知道所謂視圖,其實就是存儲的查詢語句,當調用的時候,產生結果集,視圖充當的是虛擬表的角色。所以:django
一開始我也是被我這個想法驚訝到了,總以爲跨庫建視圖太過於驚悚了,畢竟實踐是檢驗真理的惟一標準嘛,隨手就在navicat上面創建一個視圖,以後運行架構
很是神奇~~那問題這樣就解決啦,仍是一條SQL語句就能夠解決問題了運維
經過這個思路,其實能夠繼續推廣:跨表聯查,建個視圖,跨庫聯查,建個視圖。建就完事了。另外這個操做其實還須要考慮數據同步的問題,由於是多庫聯查,若是數據不一致會是災難的,這個具體問題要具體分析,加鎖或者配置同步策略這些都是常規方案,因爲我沒有這個需求,就不展開討論啦。ide
這個案例對我來講頗有感觸微服務