微服務之後,如何處理數據的統一分析(類似報表)

隨着互聯網技術的發展,微服務作爲一種雲服務的架構方式被越來越多的企業採用,使用微服務的架構進行開發,提供了產品的可靠性,可擴展性,降低維護成本,同時也可以支持按需伸縮服務。對於開發人員,微服務的代碼量明顯減少,遇到問題也更容易解決。

但同時微服務也帶來了許多問題,例如:分佈式部署的複雜度明顯提升、接口調整的成本升高、對運維的需求也更高了。其中一個主要的問題是不同的服務使用獨立的數據庫,提高了數據使用的效率,但對於複雜的業務場景也帶來了查詢其他服務的數據的複雜度

微服務和數據庫

微服務架構的一個非常明顯的功能就是一個服務所擁有的數據只能通過這個服務的API來訪問

在一個電商網站中,比如,OrderService佔有一個數據庫,裏邊有一張表ORDERS;CustomerService也有自己的數據庫包含表CUSTOMERS。

通過這樣的封裝,微服務之間就解耦了。

在開發期間,開發人員可以獨立修改自己服務的數據庫shema而不需要與其他服務的開發協調勾兌

在生產上,服務之間都是隔離的。比如,一個服務從來不會因爲另外一個服務佔有了數據庫的鎖而導致阻塞等待。

不幸的是,這種數據庫的拆分讓管理數據的一致性以及不同服務間跨表查詢變得困難

1.常見問題

  目前的企業服務開發中,報表開發是比較常見的開發任務,一個業務單據上一般會引用很多的基礎數據對象,少的有幾個,多的可能有十幾個,如此會引發3個常見問題:

1.1 界面顯示數據翻譯問題:

在界面顯示上,報表引用的數據一般顯示爲名稱或編碼,但數據庫中存儲爲對象的ID。

因此,後臺服務在查詢到單據數據後需要轉換爲編碼或名稱返回界面顯示

1.2 多個服務關聯查詢問題:

在報表業務實現時,經常會出現關聯多個服務查詢的場景,例如在電商系統中,一個用戶的訂單,設計商品信息,支付信息、訂單物流信息等。需要追溯多個對象進行查詢。

1.3 數據導入問題:

報表業務中,存在很多數據導入的場景,而通過excel導入數據時,需要根據名稱或編碼翻譯爲ID然後插入數據庫中。

2. 常見解決方案探討

  對於界面顯示數據翻譯問題,按微服務的開發方式,最簡單的方案是,同步調用相關的服務進行數據翻譯。例如,

如果搜索條件中包含A的條件,則先去服務A中搜索,得到所有結果的主鍵,在服務B中使用where A.id IN (ids) 再次查詢

  可以看出中間有幾個引用的數據,就需要調用幾次遠程服務接口。一方面,開發複雜,每個表單都需要編寫相關的翻譯代碼,另一方面,調用次數過多,導致時間消耗過長。

  因此,實際業務中常見的解決方案有幾種:

2.1 數據庫中冗餘字段方式

  展示訂單信息時,需要翻譯用戶、商品、支付、物流等基礎數據屬性時,可以在訂單中直接冗餘相關的名稱字段。在保存數據中直接保存到數據庫中

此方案的問題是,如果對應的基礎數據對象修改了名稱時,需要同步修改的數據。

數據同步方案:

  • 從業務方案上,可以通過事件通知的方式,在相關的對象發生變動時,同步修改冗餘字段的內容。或者定時同步冗餘字段內容。

數據同步引發問題:

  • 但當報表不斷增加的情況下,一個數據的變動,可能引發十幾個或更多的報表或其他基礎數據的同步行爲,計算過程複雜,對數據的更新操作壓力會比較大。
  • 同時通過事件的方式進行同步,對開發要求較高,配置錯誤時,會導致數據沒有被更新,顯示錯誤。

 

2.2 直接備份數據表的方式

  可以通過定時拉取的或推送的方式從指定的數據中,同步表數據,在同步時可以通過指定字段或建立視圖等方式,僅同步指定字段內容,減少同步數據和避開敏感數據。

引發問題:

  • 此方案的問題與第一個方案類似,但微服務不斷增多的情況下,每個微服務都要同步其他微服務的數據庫表,需要同步的數據庫表會越來越多,帶來的消耗也會越來越大。數
  • 據庫之間的同步關係複雜度上升對運維的複雜度也會升高。
  • 而且同步出現問題時,也會導致界面顯示數據的不一致性。

2.3 統一數據中心查詢方式。

  通過統一的數據採集服務,將數據收歸到統一的數據中心,其他業務服務需要查詢數據時,調用統一的數據服務中心進行查詢,可以在最大程度上降低要同步數據的複雜度,通過合併多個對象查詢的方式提高訪問速度。

這就屬於OLAP(Online analytical processing),即聯機分析處理範疇了,具體實現有:

  • 使用搜索引擎
  • 在從庫上做各種報表分析操作,比如線上的A庫和B庫都實時同步到一個只讀庫中,然後在只讀庫裏JOIN一下就搞定了。

3  統一查詢方案說明

  此方案的實現主要是組合了PaaS以下幾個能力形成的:存儲模型管理,元數據模型管理,統一的數據倉庫,數據同步服務,數據查詢服務

 

存儲模型管理:

負責提供數據存儲模型的建立,由數據提供方建立對外的數據模型視圖。可支持數據提供方根據數據的敏感性或是否僅內部使用屬性等對提供的數據模型進行選擇,僅提供可對外提供的必要數據屬性。

1.支持查詢數據視圖的模型的管理,支持單表模型描述,也支持多表關聯的複雜結構數據模型描述。

 

在進行查詢視圖定義時,支持對數據進行篩選,數據提供方指定提供數據屬性範圍。

其次,有可能的情況下需要數據來源方提供ID、時間戳、刪除標記等屬性。用於後續數據抽取服務時的增量抽取能力。

2.支持對來源數據庫的連接管理,可由業務方提供只讀的數據庫賬號,用於同步服務同步數據使用。支持模型與數據庫的關係管理,支持單一數據庫部署,和多租戶多數據庫的部署模式。

 

爲支持多租戶的部署模型,部分微服務會連接存在相同的表結構多個數據庫,通過租戶或其他參數進行數據的分庫存儲。因此,在數據源模型描述支持多個數據庫的描述方式。模型視圖上僅與數據源保持關係,在來源業務系統更換數據庫或進行數據庫隔離的情況下,不需要重新修改視圖模型。

元數據模型管理:

元數據一般指用於描述數據的數據,包含對象模型,對象的屬性模型(包括屬性的數據類型,與其他對象的引用關係),以及對象的存儲模型。來源業務系統通過存儲模型管理中描述的數據倉庫的模型,與元數據的存儲模型對應,建立完整的業務系統的對象關係模型。

 

元數據模型支持屬性標籤描述,用於後續查詢服務可根據統一的標籤進行查詢,例如根據ID返回名稱時,只需要個業務提供方在模型中的名稱屬性設置標籤爲(name)即可通過統一的語句進行查詢。

統一數據倉庫:

使用支持高併發的分佈式NoSQL數據庫實現。支持按字段條件查詢的方式獲取數據。

數據同步服務:

通過多種方式從業務系統的數據庫中拉取對應的數據同步到統一數據倉庫中。

1.支持通過定時任務拉取數據方式。

2.通過binlog同步方式。

一般通過兩種方式結合,binlog可以保障數據以最短時間同步到統一數據倉庫中。當啊同步服務出現問題時,可以通過定時任務進行補償。

數據查詢服務:

  • 通過元數據模型,提供基於元數據模型的查詢服務。根據元數據模型描述,形成對應的數據模型查詢語句,調用數據倉庫的接口進行查詢。
  • 可根據標籤,進行語句的擴展,例如查詢名稱爲“張三”的用戶,可以使用name = “張三”,或者 <lable:name> = “張三”的方式描述查詢條件參數。查詢服務接收到參數後,根據元數據模型,轉換爲存儲模型的結構,調用數據倉庫的服務接口進行查詢。

統一查詢方案的優勢如下:

1.對原有業務系統無侵入,不需要修改業務服務的代碼。

2.在定義查詢視圖時,可通過限制查詢字段及增加查詢條件的方式,對敏感數據進行過濾,避免出現數據問題。

3.查詢視圖與實際業務視圖分離,業務系統可在修改自己的數據庫同時,通過修改查詢視圖,保障對原有的查詢視圖屬性不發生變化,避免影響其他服務的使用。

4.使用獨立的數據倉庫進行查詢操作,避免影響原有業務數據庫的性能。

5.通過使用NoSql數據庫構建數據倉庫,在例如界面主鍵翻譯這種高併發操作的提高執行效率。當數據倉庫性能下降時,比較傳統的關係型數據庫更容易動態增容擴展。

統一查詢方案業務上推薦使用的場景有:

1.界面顯示數據時的主鍵翻譯爲名稱、編碼。

2.支持公式或報表等需要同步模型配置查詢數據的場景。

3.可以用於參照服務,參照服務的數據實效性要求不高,使用統一數據倉庫有利於降低主數據庫的業務壓力。

參考鏈接:

https://zhuanlan.zhihu.com/p/47011506

https://segmentfault.com/q/1010000009053767

發佈了410 篇原創文章 · 獲贊 1345 · 訪問量 208萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章