目錄
中間件的用途
中間件技術(shù)?
中間件的特點
中間件的十大優(yōu)越性?
企業(yè)應(yīng)用集成
輕量級架構(gòu)
Struts框架
spring
Hibernate
實際項目舉例
產(chǎn)品邏輯大圖
gRPC的接口規(guī)范
關(guān)鍵中間件交互
整體架構(gòu)設(shè)計
大數(shù)據(jù)素材底層處理
業(yè)務(wù)交互大圖
底層數(shù)據(jù)素材加工大圖
中間件的用途
中間件技術(shù)?
屬于可復(fù)用軟件的范疇
中間件的特點
中間件的十大優(yōu)越性?
企業(yè)應(yīng)用集成
?
輕量級架構(gòu)
Struts框架
工作流程:
spring
企業(yè)級應(yīng)用程序一站式解決方案
Hibernate
讓開發(fā)擺脫麻煩的JDBC代碼, 將精力更多集中在編寫數(shù)據(jù)表示和 業(yè)務(wù)邏輯上
?用struts, spring,hibernate構(gòu)造輕量級WEB框架:
實際項目舉例
產(chǎn)品邏輯大圖
核心功能服務(wù): 由于涉及的功能模塊眾多,150+http(s)接口給頁面提供數(shù)據(jù)
中間件技術(shù): 整體平臺依賴的中間件技術(shù)眾多, 分別包括:
- kafka消息。 使用kafka消息實現(xiàn)與第三方系統(tǒng)的異步交互,包括通過kafka消息,將財務(wù)結(jié)算數(shù)據(jù)同步給財務(wù)系統(tǒng),將廣告數(shù)據(jù)同步給第三方基礎(chǔ)平臺系統(tǒng)等等;
- hive數(shù)據(jù)。 大數(shù)據(jù)處理業(yè)務(wù)中,存在多種大數(shù)據(jù)處理場景,如 從第三方hive表中拿數(shù)據(jù),然后進行加工,清洗,處理等,或者將從MySQL,緩存,hive,第三方接口等多處數(shù)據(jù)源拿來的數(shù)據(jù)經(jīng)過統(tǒng)一處理,然后寫入hive表中供后續(xù)業(yè)務(wù)邏輯使用。 hive表數(shù)據(jù)處理通常采用離線數(shù)據(jù)處理方式, 如 定時任務(wù) 方式處理, 每小時、每2小時、或者每天處理一次; 處理的數(shù)據(jù)量級也多種多樣,如 幾十上百條的小批量多頻次處理, 或者百萬千萬級別的每天增量數(shù)據(jù)處理等等。hive適合用來做批量數(shù)據(jù)統(tǒng)計分析。
- 定時任務(wù)。 定時任務(wù)顧名思義,是按不同的頻率來定時運行,通常用來離線加工數(shù)據(jù)。 業(yè)務(wù)系統(tǒng)中涉及100+個定時任務(wù), 分別來處理不同數(shù)據(jù)源,不同量級,不同業(yè)務(wù)場景下的數(shù)據(jù)。
- HDFS文件。用于大規(guī)模數(shù)據(jù)的分布式讀寫,特別是讀多寫少的場景。
存儲非常大的文件并且對延時沒有要求 。HDFS文件在業(yè)務(wù)系統(tǒng)中,用于大批量寫入數(shù)據(jù),供第三方系統(tǒng)(如下游業(yè)務(wù)系統(tǒng)引擎等)讀取。 業(yè)務(wù)場景中, 首先會從第三方拿到大批量廣告素材數(shù)據(jù), 然后本系統(tǒng)進行過濾、填充、篩選后, 然后調(diào)用第三方接口進行素材數(shù)據(jù)審核。 將符合業(yè)務(wù)要求的審核廣告素材數(shù)據(jù), 通過定時任務(wù)一次性寫入HDFS文件中,寫入的字段包括 素材ID、流量包ID、審核狀態(tài)等信息。? - ?ClickHouse. 以下簡稱CH表,列式存儲數(shù)據(jù)庫,一款面向 OLAP 的數(shù)據(jù)庫,ClickHouse支持類SQL語言,提供了傳統(tǒng)關(guān)系型數(shù)據(jù)的便利。實際使用中,CH表的上游表是hive表,通過配置公司統(tǒng)一提供的IDP任務(wù),即可按業(yè)務(wù)需求將hive表中的數(shù)據(jù),自動同步到CH表中。CH表中的數(shù)據(jù)成為下游報表引擎的數(shù)據(jù)源。
- 數(shù)據(jù)庫。業(yè)務(wù)中采用了主從的MySQL數(shù)據(jù)庫,中間件采用mybatis。 由于業(yè)務(wù)上涉及多張表的增刪改查,以及對于某張表可能會新增列字段等等操作,業(yè)務(wù)代碼中采用了統(tǒng)一封裝,既防止了SQL注入風(fēng)險,又方便程序的擴展。
- 緩存Redis。業(yè)務(wù)中采用緩存Redis集群來存儲給下游業(yè)務(wù)的核心業(yè)務(wù)數(shù)據(jù)。 在業(yè)務(wù)實現(xiàn)中,首先通過定時任務(wù),將MySQL數(shù)據(jù)庫中的業(yè)務(wù)數(shù)據(jù),如應(yīng)用數(shù)據(jù),廣告位數(shù)據(jù),內(nèi)容位數(shù)據(jù),屏蔽規(guī)則數(shù)據(jù),媒體數(shù)據(jù)等,寫入Redis緩存。 由于業(yè)務(wù)數(shù)據(jù)量百萬級別,且業(yè)務(wù)數(shù)據(jù)存在實時變動的可能,整體同步一次數(shù)據(jù),定時任務(wù)需要執(zhí)行40多分鐘,存在影響后續(xù)邏輯的風(fēng)險。 為了加快緩存的同步,業(yè)務(wù)上進行了一次整體緩存同步的優(yōu)化,將定時任務(wù)執(zhí)行時間從40多分鐘,減少到20分鐘以內(nèi)。 具體的做法包括: 采用異步多線程,并行處理應(yīng)用數(shù)據(jù),廣告位數(shù)據(jù),內(nèi)容位數(shù)據(jù),屏蔽規(guī)則數(shù)據(jù),媒體數(shù)據(jù)等; redis的寫入方式改成Pipeline管道寫入方式。?
- 報表引擎。報表引擎是公司架構(gòu)組提供的一組底層服務(wù),作為業(yè)務(wù)方可直接接入調(diào)用即可。 報表引擎對應(yīng)的接口,調(diào)用傳參數(shù)主要包括需要數(shù)據(jù)的維度、時間端、升序、倒序排序等等。?
- grpc。rpc 遠程過程調(diào)用, 不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議,簡單的理解是一個節(jié)點請求另一個節(jié)點提供的服務(wù)。RPC 只是一套協(xié)議,基于這套協(xié)議規(guī)范來實現(xiàn)的框架都可以稱為 RPC 框架,比較典型的有 Dubbo、Thrift 和 gRPC。 GRPC是一種現(xiàn)代化開源的高性能RPC框架。
gRPC的接口規(guī)范
a. 當(dāng)我們要創(chuàng)建gRPC服務(wù)時,通常第一步是在.proto文件中定義接口。使用這個.proto文件可以用protoc編譯器生成客戶端和服務(wù)端代碼。服務(wù)端和客戶端共享.proto文件。 客戶端代碼的生成,無需編寫客戶端代碼,可以在具有許多服務(wù)的應(yīng)用程序中節(jié)省大量大量開發(fā)時間。
b. 在.proto文件中清晰的描述了接口的入?yún)⒁约俺鰠?,并且基于這個文件生成各中語言都能進行通信的接口,從而實現(xiàn)不同語言之間的通信。
c. 通過protoc生成的代碼會確保客戶端或者服務(wù)端發(fā)送的數(shù)據(jù)合乎規(guī)范,在各個平臺和實現(xiàn)之間是一致的。
gRPC的優(yōu)點 包括:?高效的二進制編碼機制、清晰的接口規(guī)范、對流的支持。
實際業(yè)務(wù)場景中,分為兩個方面的grpc使用:
1、 作為服務(wù)端,創(chuàng)建grpc服務(wù),通過proto文件定義接口,入?yún)?,出參,并實現(xiàn)grpc接口的邏輯。 同時將接口即proto文件提供給第三方調(diào)用。
2、作為客戶端,通過proto文件,生成客戶端代碼,去調(diào)用第三方業(yè)務(wù)提供的grpc接口來獲取數(shù)據(jù)。
本人負責(zé)的業(yè)務(wù)系統(tǒng)中,存在若干grpc接口,提供不同場景、不同維度的數(shù)據(jù),同時也會作為客戶端,去調(diào)用第三方提供的grpc接口來獲取數(shù)據(jù)。?
- kconf. 公司內(nèi)部提供出來的配置平臺。 在上面可以進行各種k/v配置,然后在程序代碼用引用kconf包,并且可以增刪改查kconf中的配置。 支持的數(shù)據(jù)格式多種多樣,如 boolean, int, float/double, hashmap/hashset,List鏈表,自定義對象等等。 在實際的業(yè)務(wù)開發(fā)中,通常有幾種主要用途:?
1、作為開關(guān)。 比如,配置值為TRUE時, 新增的邏輯生效;配置值為FALSE時,跳過新邏輯;
2、逐漸放量開關(guān)。 比如,配置值為20%,則20%流量/用戶會看到新業(yè)務(wù)功能; 配置值為50%,則會有50%流量/用戶會看到新業(yè)務(wù)功能; 觀察一段時間,新功能正常, 會逐漸增大值,直到100%,這樣新業(yè)務(wù)功能就完成了全部生效,系統(tǒng)發(fā)布全部完成了。
3、作為配置型常量數(shù)據(jù)。 比如, 業(yè)務(wù)中會用到一些相對固定不變的業(yè)務(wù)數(shù)據(jù), 這些業(yè)務(wù)數(shù)據(jù)又想實現(xiàn)方便的改動(不需要改動代碼、進行發(fā)布上線等一系列復(fù)雜操作),以及改動后可以實時生效, 就會將這些業(yè)務(wù)常量數(shù)據(jù) 配置到kconf中,然后在業(yè)務(wù)代碼中做使用。
存儲層: 涉及的存儲中間件較多,有 MySQL,hive表,緩存,圖片/視頻存儲等等; 涉及的表眾多, MySQL數(shù)據(jù)庫的表有100+,涉及的hive表有50+; 且需要多數(shù)據(jù)源同時處理。
整體MySQL數(shù)據(jù)庫采用主從結(jié)構(gòu),核心邏輯、實時性要求高的邏輯會直接對主庫操作。?
hive表則是作為大數(shù)據(jù)存儲來使用,并結(jié)合離線任務(wù)來做大數(shù)據(jù)的加工處理后,作為底層存儲。? 公司級別也會提供hive對應(yīng)的公共平臺、接口, 可以方便實現(xiàn)同其他數(shù)據(jù)源的遷移, 比如 hive表數(shù)據(jù)導(dǎo)入MySQL表,MySQL表數(shù)據(jù)導(dǎo)入hive表,hive表數(shù)據(jù)導(dǎo)入ClickHouse表等等。 由于不同的業(yè)務(wù)線都會有類似的操作需求, 所以架構(gòu)組會將這類操作統(tǒng)一封裝后,提供統(tǒng)一的公共平臺, 有需要的業(yè)務(wù)線只需要在上面配置離線數(shù)據(jù)任務(wù)IDP即可。?
關(guān)鍵中間件交互
整體架構(gòu)設(shè)計
大數(shù)據(jù)素材底層處理
重點與難點:
- 素材過濾。? 上游第三方業(yè)務(wù)系統(tǒng)的素材數(shù)量量級非常大(百萬千萬/天), 素材是全量的素材, 需要根據(jù)業(yè)務(wù)需求, 對全量素材進行多個條件過濾篩選, 篩選出符合業(yè)務(wù)需求的素材。 篩選的條件有多種,且隨著業(yè)務(wù)發(fā)展,可能存在變動。 故而業(yè)務(wù)過濾 一方面需要滿足業(yè)務(wù)需求, 另一方面也需要針對多種素材進行適配,方便后續(xù)擴展。? 整個素材過濾邏輯處理,為了避免寫多個if/else語句造成業(yè)務(wù)邏輯過于耦合,實現(xiàn)時采用了策略模式。 實際過濾條件眾多, 這里為了便于說明討論,簡化為過濾條件A,B,C,D4個條件。?
策略設(shè)計模式的特點:
1、提供一個策略接口
2、提供多個策略接口的實現(xiàn)類
3、提供一個策略上下文
策略設(shè)計模式優(yōu)點:
1、可以自由切換算法(具體實現(xiàn))
2、避免了多條件的判斷(干掉了if else)
3、擴展性好可以定義新的算法提供給使用者(增加新功能時只需要增加代碼而不需要修改代碼)
于是4個過濾條件,可以實現(xiàn)為4個策略接口的實現(xiàn)類。? 后面需求變更,比如新增了2個過濾條件, 那么只需要新增2個策略接口的實現(xiàn)類即可,既不影響原有的實現(xiàn),避免改壞之前的業(yè)務(wù)邏輯, 有方便新增了新的業(yè)務(wù)邏輯。?
- 素材加工。? 從第三方拿到原始素材,往往都缺少業(yè)務(wù)需要的信息,比如,圖片素材,需要對圖片的大小,長寬等進一步裁剪,需要進一步補充title,標(biāo)題,圖片描述等等信息。 故而素材加工邏輯中,首先會調(diào)用第三方裁剪接口,進一步修剪圖片; 然后調(diào)用引擎?zhèn)冉涌谀玫絫itle,標(biāo)題,圖片描述等等信息,填充原始素材信息。 填充完畢后, 將加工后的素材批量寫入MySQL素材庫,供后續(xù)邏輯使用。?
由于從第三方拿到的素材種類比較多,除了圖片,視頻外,還需要覆蓋各個業(yè)務(wù)場景,以及不同業(yè)務(wù)場景下的素材,需要進一步填充的信息也不同。 故而素材加工邏輯中需要重點考慮對各種各樣素材的正確處理。
- 素材審核。 素材審核,顧名思義,是將加工后的素材 給媒體審核,只有審核通過的素材才能最終在終端展示。 業(yè)務(wù)場景中,素材審核分為兩種,一種是頁面上審核,一種是將素材送去第三方審核。?
頁面上審核場景下,加工后的素材存儲在MySQL素材庫中。 審核邏輯會拿到待審核的素材,展示在頁面上,供媒體人員審核。 素材審核通過、審核拒絕后,都會實時將審核結(jié)果更新到MySQL素材庫中。
另一種素材審核方式,將素材送去第三方審核,即通過調(diào)用第三方提供的接口方式,將待審核的素材送去第三方。 然后會實現(xiàn)一個定時任務(wù),離線調(diào)用第三方的審核狀態(tài)接口,來獲取最終的素材審核狀態(tài)。 同樣,?素材審核通過、審核拒絕后,都會實時將審核結(jié)果更新到MySQL素材庫中。
- 素材寫入hdfs。 由于素材數(shù)據(jù)量級巨大,且需要全部同步給第三方引擎?zhèn)仁褂茫?這里采用定時任務(wù),實現(xiàn)離線寫入。 即定時任務(wù)每隔一段時間執(zhí)行一次,將全量審核通過的素材寫入hdfs文件中,寫入的核心字段包括素材ID,審核狀態(tài),素材所屬流量包等等。?
業(yè)務(wù)交互大圖
文章來源:http://www.zghlxwxcb.cn/news/detail-503051.html
底層數(shù)據(jù)素材加工大圖
文章來源地址http://www.zghlxwxcb.cn/news/detail-503051.html
到了這里,關(guān)于軟考高級系統(tǒng)架構(gòu)設(shè)計師(八) 基于中間件的開發(fā)&實際項目的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!