Java生鮮電商平臺-SpringCloud微服務開發中的數據架構設計實戰精講

Java生鮮電商平臺-SpringCloud微服務開發中的數據架構設計實戰精講

?

Java生鮮電商平臺:? ?微服務是當前非常流行的技術框架,通過服務的小型化、原子化以及分布式架構的彈性伸縮和高可用性,可以實現業務之間的松耦合、業務的靈活調整組合以及系統的高可用性。為業務創新和業務持續提供了一個良好的基礎平臺。本文包括下面若干內容。

1.微服務技術框架中的多層數據架構設計

2.數據架構設計中的要點

3.要點1:數據易用性

4.要點2:主、副數據及數據解耦

5.要點3:分庫分表

6.要點4:多源數據適配

7.要點5:多源數據緩存

8.要點6:數據集市

為了容易理解,本文用一個簡化的銷售模型來闡述,如下圖。圖1顯示了客戶、賣家、商品、定價、訂單的關系(這里省略支付、物流等其他元素)。

圖1 銷售模型

在這個銷售模型中,賣家提供商品、制定價格,客戶選擇產品購買、形成銷售訂單。根據微服務的理念設計,可以劃分為客戶服務、賣家服務、商品服務、定價服務、訂單服務,以及公共服務(比如認證、權限、通知等),如圖2所示。

圖2 微服務功能

微服務架構中的多層數據架構設計

分布式架構一般把系統分為 Saas(Software-as-a-Service)、Paas(Platform-as-a-Service)、Iaas(Infrastructure as a Service )三層。其中 Saas 層負責對外部提供業務服務,Paas 層提供基礎應用平臺,Iaas 層提供基礎設施。微服務垂直嵌入這三層服務之中,相互獨立。因此數據架構設計時需要考慮三層服務對數據的關注點,又要考慮微服務的獨立性。

數據架構的分層設計

圖3 微服務技術框架

如圖3所示,Iaas 層提供程序運行的物理基礎環境(這邊涉及很多硬件·網絡內容,在本文中省略)。Pass 層細分為三層,基礎服務層,主要負責數據存儲處理;事務框架層,主要負責微服務的注冊·調度管理、分布式事務處理;應用服務層、主要實現各個微服務的 API,供其它微服務直接調用以及 Saas 層的服務調用。

Saas 服務就是公開對外提供的業務服務.

數據架構自下向上相應的分為 Raw Data 層、Logic Data(inner)層和 Logic Data(outer)層(Iaas 中主要以基礎硬件環境為主,在本文中省略)。

Raw Data 層是基于數據庫、文件或者其他形式數據內容。Logic Data(inner)層是微服務 API 使用的邏輯數據,比如客戶數據、訂單數據等等。

Logic Data(outer)層是對外服務提供數據,比如客戶訂單數據。因此,我們的數據架構的分層結果如圖4所示。

圖4 數據分層架構

除此之外,很多情報會以畫面或報表的形式展現出來。因此在 Logic Data(outer) 之上,可以構建 Information Block(常用的信息塊)、通過 View type(顯示模式)的設定后,最終 View 展現出來。

如圖4所示,越靠近對外服務層,客戶對設計者的影響度越大,越需要從使用性、易用性、適用性等考慮。反之,越遠離對外服務層,設計上更關心數據的存儲。

數據三層架構的好處是實現數據從系統實現到業務實現的逐層過渡,實現業務數據和系統數據間的松耦合。同時實現業務的靈活擴展和系統的靈活擴展

數據架構設計中的要點

上面講述了數據架構的分層設計,下面講述數據架構設計中的要點。

要點1:數據易用性

數據無論用什么方式實現,其最終目的都是為業務(或者是客戶)使用的。因此,在對外提供服務的時候,數據的易用性非常關鍵。

圖5 數據易用性

如圖5所示,客戶信息在 Logic Data(inner) 層中為了數據的柔軟性和非冗余,把人員信息拆成若干子表來存儲。比如,人員地址表可以無限多的存儲客戶地址信息。這樣的好處在于每次人員地址更新時,不用直接更新人員地址,而是生成一個新的地址數據,原有的地址信息作為歷史數據得到保存,易于數據快速恢復和歷史信息追蹤。

但在 Logic Data(outer)層提供外部數據的時候,首先考慮的是一次性能提供足夠用的信息(畢竟查詢的操作大大高于修改的操作),減少業務場景中不需要的信息。比如對一般客戶只提供三個常用地址的時候,數據設計中地址1、地址2和地址3放在一張表中。

要點2:主、副數據及數據解耦

每個微服務 API 的數據完全獨立是不太現實的,比如訂單中需要有商品、客戶(包括收貨者)、賣家以及價格等數據。如果這些數據都在訂單服務 API 中管理,那么客戶情報的變更、價格調整等信息都要同步給訂單 API 中數據,數據的耦合度就會變得非常高。

在數據設計的時候,需要考慮降低數據間的相互依賴性。因此,首先需要確定每個微服務 API 的主數據和副數據。主數據指微服務 API 的核心數據,這種數據的增刪改主要集中在某個微服務 API 中,比如訂單服務 API 中的訂單數據。副數據指參照或者映射其他微服務 API 的數據,比如訂單服務 API 中的商品數據、價格數據等。

其次,為了降低數據之間的耦合度,用數據關聯表來表征數據間的關系。如果想去掉數據間的關聯關系,直接去掉關聯表即可,對數據本身的沒有任何影響。具體如圖6所示。

圖6 主、副數據及數據解耦

要點3:分庫分表

隨著業務數據量不斷增加,單一數據庫或單一數據表中會積累大量的數據,比如訂單數據,隨著時間推移和客戶數量的增加,產生的訂單數據也會越來越多。當數據累積到一定程度后,數據操作的性能會大幅下降,也就是我們常說的數據庫“帶不動了”。所以,在數據架構設計階段就應該考慮數據的分庫分表。

如圖7所示,分庫,即我們把訂單數據分為當前數據應用庫、歷史數據庫、歷史歸檔數據庫。當前數據應用庫用來支持新訂單的生成以及執行中訂單的增刪改查。歷史數據庫(這里舉例分為最近3個月和最近1年)當客戶想看過往訂單的時候才使用。歷史歸檔數據(按年間歸檔)原則上不直接對客戶公開,用于備查、統計分析。

對于當前數據應用庫,可以繼續再分庫,按客戶號范圍來分庫。這樣每個數據庫的大小都能得到有效控制。分表,即把一條信息分別存儲在兩張或多張表中。比如把訂單信息按基本信息和詳細信息分表,就可以適用于訂單的基本信息查詢和訂單詳細信息查詢。總之,分庫分表的核心就是控制單一數據庫的負荷(數據量和數據信息量),通過多表多庫來應對業務數據量的增長。

圖7 分表分庫

要點4:多源數據適配

傳統的關系型數據庫之外,有多種多樣的數據源,比如圖像、聲音、視頻等多媒體數據文件或數據流,CSV、TXT、Doc、Excle、PDF、XML 等各種異構數。這些數據都需要做相應的處理,轉換成可管理的數據信息。因此在數據架構設計的時候,需要給不同性質的數據源配置相對應的讀寫適配器,同時也需要有統一調度的地方,如圖8所示。

圖8 多源數據適配

要點5:多源數據緩存

數據處理的性能除了處理邏輯的復雜度以外,還有很大一部分是目標數據的操作時長(含對硬件磁盤設備的讀寫以及網絡的傳輸)。網絡速度特別是光纖的使用后已經大幅度提高,但機器磁盤的讀寫效率并沒有顯著提高,因此減少磁盤讀寫是提高效率的一個重要途徑。

數據緩存就是把常用的數據(不會經常更改的數據)、最近使用數據放到內存中。這樣就可以大幅降低系統對硬件磁盤設備的操作開銷,提高整個數據系統的性能,如圖9所示。

圖9 數據緩存

要點6:數據集市

數據集市是一個很大的話題。當現有的數據不能簡單地通過幾個表數據關聯以及簡單加工后就可以供業務使用的時候,就需要考慮構建數據集市。數據集市以數據運用的觀點來分析加工數據,通過多源數據的導入、清洗、加工、視圖做成等一系列的數據操作后,為業務提供可用的、穩定的數據源。

例如,對銷售分析中、什么樣的客戶喜歡什么樣的商品、價格對銷售金額的影響、銷售金額跟地區日期的關聯關系等多維度分析,就要用數據集市的概念,如圖10所示。

圖10 數據集市

數據承載著信息,好的數據架構設計會使業務系統變得更加流暢、更加容易理解和維護。本文只是總結一些在實際工程中的體會,供大家分享。如果有不足之處、也請大家補充、賜教。

如果有不太懂的地方,請加QQ群:793305035



轉載于:https://www.cnblogs.com/jurendage/p/11322065.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247206.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247206.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247206.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JS兩個對象數組過濾掉相同的對象

let arr1 [{uid:1,name:張三},{uid:2,name:李四}]; let arr2 [{id:1,name:張三},{id:2,name:王五,age:23},{id:3,name:羅翔}]; 去掉arr2中包含的arr1相同name的對象: //ES6的方法,得到新數組 const newArr arr2.filter((item) > {return !arr1.some(ele>…

亞倫?斯沃茨:提升時間的品質

亞倫?斯沃茨:提升時間的品質 不休不眠地工作是低效的,怎樣發揮時間的最大效率? 伏維閣主 2013-01-18 16:45圖片來源:personalitytutor.com (亞倫?斯沃茨Aaron Swartz / 文)《 怎樣有效利用時間 》中給出的…

useEffect中使用異步函數

useEffect是不能直接用 async await 語法糖的 /* 錯誤用法 ,effect不支持直接 async await*/useEffect(async ()>{/* 請求數據 */const res await getData()},[]) useEffect 的回調參數返回的是一個清除副作用的 clean-up 函數。因此無法返回 Promise&#xf…

Flex4_HttpService組件

1、在JavaWeb項目中新建Servlet(FlexLoginServelt) : public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");response.setContentType("text…

想要提高記憶力?做夢去吧!

想要提高記憶力?做夢去吧! 豆豆助 2010-11-26 11:47經驗說:不好好學習,就知道睡覺 實驗說:要想記憶好,睡覺不能少。做夢可以增強我們的記憶。 有沒有辦法能讓人不費吹灰之力增強記憶力? 做夢吧你…

This beta version of Typora is expired, please download and install a newer version. 解決方案

原文鏈接:https://blog.csdn.net/yyywxk/article/details/125133205 問題描述 今日打開 Typora 軟件時,突然報錯,提示軟件版本已過期,需要安裝新版本,如下圖所示。 關閉錯誤提示框后會自動跳轉到:https://…

MySQL查詢count(*)、count(1)、count(field)的區別收集

count(*)對行的數目進行計算,包含NULLcount(column)對特定的列的值具有的行數進行計算,不包含NULL值。 count()還有一種使用方式,count(1)這個用法和count(*)的結果是一樣的。 任何情況下select count(*) from tablename是最優選擇&#xff1…

真想學習?扔掉你詳細的計劃吧!

真想學習?扔掉你詳細的計劃吧! 該不該定個計劃?詳細的計劃確實可以更高效,也許可以將你減肥的速度加快一倍。但是如果想學習,還是扔掉詳細的計劃吧!因為它會占用你太多的認知資源,只顧著悶頭做事…

Swift中文件和圖片上傳處理

前言:基于Alamofire4.5網絡框架開發的Swift項目中上傳文件和圖片代碼參考。 上傳文件 extension HttpRequestService {typealias UploadDoneBlock (_ dict:[String : Any]) -> Void//成功blockfunc uploadEcgFileWithGatherRecord(model :RecordModel, fileName…

下載各種在線視頻及字幕

1. http://en.savefrom.net/ 支持30多個有名的網頁呢 ,YouTube等等 Supported resourcesHow to use?filefactory.comsendspace.com youtube.commetacafe.combreak.comdailymotion.comvimeo.comsevenload.commail.rusmotri.comyandex.rurambler.rutvigle.ruintv.ru…

React Icons

發現一個Icon庫,分享下哈; 使用React-Icons輕松地在React項目中包含流行圖標,它利用es6導入,允許只包含項目正在使用的圖標。 Installation (for standard modern project) npm install react-icons --save Usage import { FaBeer } from react-ico…

對flex深入研究一點

flex頂層設計 1.在任何流動的方向上(包括上下左右)都能進行良好的布局 2.可以以逆序 或者 以任意順序排列布局 3.可以線性的沿著主軸一字排開 或者 沿著側軸換行排列 4.可以彈性的在任意的容器中伸縮大小 5.可以使子元素們在容器主軸方向上 或者 在容器側軸方向上 進行對齊 主軸…

那些你可能還不知道的新發明

The Wello WaterWheel 對世界上六分之一的人來說,取水是個苦活:步行數小時,排隊等待,負重運送。 而花費在這個基本需求上的時間讓許多兒童不得不輟學,讓女人不能負起責任來處理家務或者工作以取得收入。在很多欠發達地…

AntD中Form的input正則校驗:不能輸入空格

什么是正則表達式? 在編寫處理字符串的程序或網頁時,經常有查找符合某些復雜規則的字符串的需要。正則表達式就是用于描述這些規則的工具。換句話說,正則表達式就是記錄文本規則的代碼。 正則test() 方法 定義和用法 test() 方法用于檢測一…

引用數據類型分類

引用類既是自己定義的一個類,后面應用非常廣泛 類的定義格式 創建java文件,與類名相同 public class 類名{ 數據類型 屬性名稱1; 數據類型 屬性名稱2; … } publicclass Phone { /* * 屬性 */ String brand;// 品牌型號 String …

關于英文郵件一些tips

需要寫的英文郵件多了,就覺得很吃力,尤其是當需要經常寫給同一個人時。希望郵件的開頭、結尾、一些客套的話能有不同的表達~~ 郵件的開頭:感謝讀者是郵件開場白的好辦法。感謝您的讀者能讓對方感到高興,特別是之后你有事相求的情…

react之react-spring動效庫

react-spring具有基于鉤子和基于組件的API,這里將專門針對所有動畫使用具有基本狀態的鉤子. framer-motion也很好用,但是體積2M多,太大了勸退 react-spring才6KB. react-spring npm搜索 老官網react-spring 官網Getting started | React Spring 做了個橫向遍…

Java生鮮電商平臺-電商中海量搜索ElasticSearch架構設計實戰與源碼解析

Java生鮮電商平臺-電商中海量搜索ElasticSearch架構設計實戰與源碼解析 生鮮電商搜索引擎的特點 眾所周知,標準的搜索引擎主要分成三個大的部分,第一步是爬蟲系統,第二步是數據分析,第三步才是檢索結果。首先,電商的搜…

并行批處理多個文件 matlab

%初始化matlab并行運行環境 % Initialize Matlab Parallel Computing Environment CoreNum2; %設定機器CPU核心數量&#xff0c;我的機器是雙核&#xff0c;所以CoreNum2 if matlabpool(size)<0 %判斷并行計算環境是否已然啟動 matlabpool(open,local,CoreNum); %若尚未啟動…

答應我不要問TCP三次握手四次揮手

衍生頭疼問題如下。 請畫出三次握手和四次揮手的示意圖為什么連接的時候是三次握手&#xff1f;什么是半連接隊列&#xff1f;ISN(Initial Sequence Number)是固定的嗎&#xff1f;三次握手過程中可以攜帶數據嗎&#xff1f;如果第三次握手丟失了&#xff0c;客戶端服務端會如…