如何将“分布式”、“服務化”技(jì)術(shù)在開(kāi)發ERP中實戰應用

來(lái)源:傲鵬ERP 發布時(shí)間(jiān):2019-01-05 10:13:17 點擊:303443次 作(zuò)者:傲鵬erp文工


自主開(kāi)發ERP系統,系統主要功能模塊無非是訂單管理(lǐ)、商品管理(lǐ)、生(shēng)産采購、倉庫管理(lǐ)、物流管理(lǐ)、财務管理(lǐ)等等。作(zuò)為(wèi)一個(gè)管理(lǐ)系統,大(dà)家(jiā)的一般開(kāi)發習慣就是使用.Net或Java技(jì)術(shù),建立一個(gè)單塊(單進程)架構的應用,隻有(yǒu)一個(gè)SQLServer或MySql數(shù)據庫。然後在項目文件中分一下各個(gè)模塊,三層結構方式組織代碼編寫開(kāi)發。最後測試,交付上(shàng)線。開(kāi)始因為(wèi)數(shù)據量不大(dà),系統性能還(hái)不錯,各種列表查詢,報表查詢,Excel數(shù)據導出功能等用的都很(hěn)流暢。但(dàn)是随着公司業務發展,訂單量日積月累,後期各種業務部門(mén)的報表查詢、數(shù)據導出需求不斷增多(duō),我們漸漸就感覺系統運行(xíng)越來(lái)越慢。起初解決想法優化數(shù)據庫。我們可(kě)能的一種嘗試就是将數(shù)據庫單獨放置到一個(gè)服務器(qì),實現數(shù)據庫和(hé)應用程序分離,或者是建立各種數(shù)據庫表索引,優化程序代碼等方法。經過這樣優化,系統某些(xiē)功能可(kě)能性能的确大(dà)大(dà)提高(gāo),但(dàn)是我們還(hái)是發現某些(xiē)功能列表的數(shù)據查詢導出依然很(hěn)慢,或者随着數(shù)據量繼續積累,原來(lái)較快的列表導出功能,也愈來(lái)愈變得(de)緩慢了。有(yǒu)人(rén)會(huì)說拆分。但(dàn)ERP系統并發量不高(gāo),主要是業務複雜,各種業務耦合度遠高(gāo)于那(nà)些(xiē)互聯網應用,數(shù)據查詢邏輯要遠比互聯網系統複雜,一個(gè)列表頁查詢出來(lái)的數(shù)據,往往需要關聯4、5張表才能得(de)到結果。有(yǒu)些(xiē)報表類的甚至更多(duō)。加上(shàng)各種業務操作(zuò)事務性、數(shù)據一緻性要求很(hěn)高(gāo),無法拆分。

解決方法是采用互聯網思維我們不要去做(zuò)一個(gè)大(dà)一統的系統了。把他們一個(gè)個(gè)小(xiǎo)系統。然後通(tōng)過系統接口讓這些(xiē)小(xiǎo)系統相互通(tōng)信。這樣來(lái)組成一個(gè)大(dà)系統,具體(tǐ)來(lái)說就是“分布式”、“服務化”的互聯網思維。讓系統在架構設計(jì)上(shàng)就是一個(gè)先天支持高(gāo)度可(kě)擴展的系統。

怎麽做(zuò)呢?具體(tǐ)來(lái)說就是要将訂單管理(lǐ)、商品管理(lǐ)、生(shēng)産采購、倉庫管理(lǐ)、物流管理(lǐ)、财務管理(lǐ)拆分成一個(gè)個(gè)子系統。這些(xiē)子系統可(kě)以單獨設計(jì)開(kāi)發,對外暴露出各種其他子系統需求的數(shù)據接口即可(kě)。每個(gè)子系統都有(yǒu)單獨的數(shù)據庫。甚至這些(xiē)子系統可(kě)以交由不同的團隊去開(kāi)發和(hé)維護,使用不同的技(jì)術(shù)體(tǐ)系,使用不同的數(shù)據庫。而不是再像以前那(nà)樣,都集成在同一個(gè)大(dà)而全的系統中,一個(gè)大(dà)而全的數(shù)據庫。他有(yǒu)什麽優點呢?

1、解決系統的性能問題:

以往數(shù)據庫實例隻有(yǒu)一個(gè),沒法擴展出多(duō)個(gè)實例,以便在性能受限的情況下依靠增加數(shù)據庫實例來(lái)達到負載均衡。也許有(yǒu)人(rén)會(huì)說可(kě)以使用讀寫分離方案,但(dàn)是因為(wèi)ERP系統的特點,這個(gè)方案很(hěn)多(duō)時(shí)候不現實。比如說操作(zuò)庫存的時(shí)候,你(nǐ)不能從讀庫裏讀庫存,然後在寫庫裏寫入庫存。因為(wèi)主從複制(zhì)會(huì)有(yǒu)時(shí)效性,寫入的庫存并不能馬上(shàng)寫入從庫。這樣的場(chǎng)景在ERP中也有(yǒu)多(duō)處。何況寫庫不能擴展,隻能有(yǒu)一個(gè)。而新設計(jì)方案是寫庫是分離的,每個(gè)子系統有(yǒu)自己的數(shù)據庫。

2、更新非常方便:

各個(gè)子系統以後台微服務的方式存在。前台一個(gè)單獨的web項目,這個(gè)web項目調用後台這些(xiē)子系統的服務接口。這樣的設計(jì),在某個(gè)業務子系統需要更新的時(shí)候,可(kě)以單獨更新。不用像以前那(nà)種單進程架構時(shí),一個(gè)小(xiǎo)更新需要整個(gè)系統重啓,導緻用戶會(huì)話(huà)也丢失,用戶需要新登錄。而現在的這種設計(jì)就不會(huì)有(yǒu)這個(gè)問題。

系統整體(tǐ)設計(jì)

系統物理(lǐ)部署視(shì)圖


如何在開(kāi)發ERP中使用“分布式”、“服務化”技(jì)術(shù)

詳細設計(jì)

拆分應用層

拆分應用層,是踐行(xíng)“微服務”架構的理(lǐ)念。将原來(lái)大(dà)而全的單進程架構按照業務模塊拆分成可(kě)獨立部署的應用程序,以此來(lái)達到平滑系統更新、升級、方便負載擴展的目的。具體(tǐ)來(lái)說,技(jì)術(shù)上(shàng)可(kě)以使用restfull風格的接口,也可(kě)以使用像java中dubbo框架方式來(lái)簡化開(kāi)發複雜度。ERPWeb端或其他移動端也是一個(gè)單獨的應用充當表現層。非常薄,隻是簡單的接受參數(shù),調取後台其他各種微服務程序的接口獲取所需展示的數(shù)據。微服務充當業務邏輯層,每個(gè)微服務都是可(kě)獨立部署上(shàng)線的程序,對外提供數(shù)據訪問接口。

微服務可(kě)以使用流行(xíng)的各種RPC框架,比如dubbo,可(kě)以支持多(duō)種調用協議Http、TCP等,這些(xiē)框架使得(de)編碼比較容易,框架封裝底層數(shù)據通(tōng)信細節,使得(de)客戶端執行(xíng)遠程方法如同執行(xíng)本地方法一樣簡單。

dubbo微服務架構,還(hái)支持服務治理(lǐ),負載均衡等功能。這樣不僅可(kě)以提高(gāo)系統的可(kě)用性,還(hái)能動态提升系統應用層的性能。比如倉庫管理(lǐ)中入庫業務非常繁忙,占用非常多(duō)的CPU和(hé)內(nèi)存資源,我們可(kě)以另外加一台機器(qì),單獨再部署一個(gè)倉庫管理(lǐ)服務上(shàng)去。這樣使得(de)整個(gè)系統,有(yǒu)兩個(gè)倉庫管理(lǐ)服務在同時(shí)工作(zuò),平衡負載。而這一切都是在服務注冊中心,比如Zookeeper下自動完成的。

微服務結構,天生(shēng)很(hěn)好的支持系統更新升級操作(zuò)。比如财務模塊有(yǒu)個(gè)新需求需要上(shàng)線,我們隻需要替換财務模塊的服務重啓即可(kě)。這對已經登錄系統的用戶來(lái)說,沒有(yǒu)多(duō)少(shǎo)影(yǐng)響,不用重新登陸系統,其他模塊服務使用也不受影(yǐng)響。

拆分數(shù)據層

數(shù)據庫瓶頸是ERP系統的永久之傷。大(dà)量複雜的數(shù)據查詢表連接邏輯充斥着整個(gè)系統。數(shù)據庫垂直拆分成功的關鍵就是如何重新設計(jì)系統數(shù)據層各個(gè)模塊相互耦合的問題。能解決這個(gè)問題,永久之傷便可(kě)以解決了。

我們先來(lái)看一個(gè)典型數(shù)據層模塊耦合問題。需求是展示物料庫存,列表字段:物料編号、物料名稱、品類、倉庫、數(shù)量

物料表:


如何在開(kāi)發ERP中使用“分布式”、“服務化”技(jì)術(shù)

庫存表:


如何在開(kāi)發ERP中使用“分布式”、“服務化”技(jì)術(shù)

品類和(hé)倉庫表省略。。。

很(hěn)顯然,傳統一個(gè)數(shù)據庫中,我們隻需要簡單的join操作(zuò),即可(kě)關聯這兩張表,外加關聯品類和(hé)倉庫表即可(kě)查詢出我們所要的數(shù)據。但(dàn)是現在我們的架構中,物料表和(hé)商品表不在同一個(gè)數(shù)據庫實例中,我們不能使用join操作(zuò)了,那(nà)我們該怎麽實現需求呢?

新的架構,隻允許我們通(tōng)過對方的服務接口來(lái)獲取數(shù)據,不能直接關聯對方服務的私有(yǒu)數(shù)據庫。至少(shǎo)從架構上(shàng),服務化角度來(lái)說不能直接訪問對方服務的數(shù)據庫。這種情況下,假設web模塊子系統調用倉庫子系統來(lái)獲取數(shù)據,則我們需要在倉庫模塊中創建一個(gè)service方法來(lái)裝配這些(xiē)數(shù)據。然後返回給web子系統。如下圖所示,倉庫管理(lǐ)方法首先獲取本地庫存表的物料編碼、和(hé)倉庫表的倉庫名稱字段信息,并且分頁完後最終準備返回20條數(shù)據到Web模塊前,将這20條數(shù)據中的物料ID作(zuò)為(wèi)參數(shù)請(qǐng)求商品模塊子系統,商品子系統返回這20個(gè)物料ID相關的商品信息給到倉庫管理(lǐ)模塊,然後倉庫管理(lǐ)模塊重新組裝上(shàng)列表所需的物料名稱和(hé)品類兩個(gè)字段數(shù)據,實現最終要返回給Web子系統的數(shù)據。


如何在開(kāi)發ERP中使用“分布式”、“服務化”技(jì)術(shù)

也許你(nǐ)會(huì)說,這太麻煩了,這種方法的性能肯定沒有(yǒu)直接join來(lái)的高(gāo),解決不了性能問題。咋看起來(lái)好像是這麽回事,但(dàn)是仔細考慮看看,在系統并發量低(dī)、數(shù)據量小(xiǎo)、業務不算(suàn)繁忙的環境下,的确性能還(hái)不如傳統一個(gè)數(shù)據中join方式來(lái)的快速。但(dàn)我們想想以後吧(ba)!我們現在的架構設計(jì)是将一個(gè)數(shù)據庫拆成多(duō)個(gè)數(shù)據庫,每個(gè)數(shù)據庫可(kě)以運行(xíng)在單獨的服務器(qì)上(shàng)去,這樣以後就能負載數(shù)據庫的壓力了。整體(tǐ)來(lái)說這樣才能不會(huì)讓數(shù)據庫成為(wèi)未來(lái)業務繁忙時(shí)候的性能瓶頸了。想想都覺得(de)讓人(rén)興奮不已,是不是?

這時(shí)候有(yǒu)人(rén)又會(huì)問,那(nà)以後系統數(shù)據量、業務更大(dà)了,連你(nǐ)這個(gè)拆分成幾個(gè)數(shù)據庫還(hái)不夠用怎麽辦呢?我的方法是,可(kě)以基于拆分的數(shù)據庫,單獨每個(gè)庫可(kě)以做(zuò)讀寫分離、使用緩存等。甚至可(kě)以繼續拆分下去,将子系統再次拆分成多(duō)個(gè)孫子系統。視(shì)業務模塊繁忙程度而定。

報表系統

有(yǒu)人(rén)又會(huì)問,有(yǒu)些(xiē)列表查詢邏輯非常複雜,關聯十多(duō)張表,如果按上(shàng)述方法拆分數(shù)據,那(nà)簡直是災難啊!是的,你(nǐ)說的沒有(yǒu)錯。這種情況下我的方案是将這種更加複雜的報表級别的數(shù)據查詢展示需求,可(kě)以單獨做(zuò)個(gè)報表系統。報表數(shù)據庫設計(jì)采用數(shù)據倉庫方式。為(wèi)了更高(gāo)的讀取性能,我們可(kě)以将數(shù)據庫表設計(jì)成很(hěn)多(duō)冗餘字段方式也就是反範式設計(jì),以及建立非常多(duō)的組合索引。

這種系統成功的關鍵就是數(shù)據和(hé)主ERP系統業務庫的同步問題了。一般可(kě)以寫一個(gè)定時(shí)同步程序,将ERP主業務系統的數(shù)據經過帥選、轉化等方式直接生(shēng)成報表視(shì)圖所需的最終或中間(jiān)數(shù)據,簡化關聯查詢。報表系統也可(kě)以采用微服務架構設計(jì)。如下圖所示:


如何在開(kāi)發ERP中使用“分布式”、“服務化”技(jì)術(shù)

如果報表所需的數(shù)據要求實時(shí)的,我們可(kě)以讓ERP系統業務操作(zuò)時(shí),觸發同步數(shù)據的請(qǐng)求,實時(shí)同步至報表庫。

分布式事務

也許有(yǒu)人(rén)又又問了,ERP系統很(hěn)多(duō)操作(zuò)都要求事務性,你(nǐ)拆分系統後怎麽實現事務性,保障數(shù)據一緻性呢?

這個(gè)問題很(hěn)好,也是我決定寫這篇文章前思考的最後一個(gè)問題。在微服務架構中,實現誇服務的事務并不容易,至少(shǎo)不像本地應用使用本地數(shù)據庫事務那(nà)樣方便,性能高(gāo)效,數(shù)據一緻性好。

也許你(nǐ)聽(tīng)過分布式事務這個(gè)概念。有(yǒu)兩種情景,一種是一個(gè)應用中使用多(duō)個(gè)數(shù)據庫,為(wèi)保障數(shù)據一緻性,需要使用分布式事務。還(hái)有(yǒu)一種情況就是針對我們這個(gè)架構而言的。微服務環境下的分布式事務,具體(tǐ)來(lái)說打個(gè)比方。采購入庫這個(gè)操作(zuò)設計(jì)在倉庫管理(lǐ)服務中。入庫後,需要更新采購子系統中的采購單中的入庫數(shù)量。這個(gè)過程要求數(shù)據一緻性,也就是采購單入庫成功後寫入了庫存表中的數(shù)量,同時(shí)要更新采購單表中的入庫數(shù)量。我們不能直接在倉庫服務中去訪問采購服務中的數(shù)據庫,必須通(tōng)過采購服務提供的服務接口才行(xíng)。如果這樣,我們怎麽能保證數(shù)據一緻性呢?因為(wèi)很(hěn)有(yǒu)可(kě)能庫存表寫入成功,但(dàn)調取采購服務寫入采購單數(shù)據時(shí)失敗了。可(kě)能是網絡問題原因導緻的,這樣數(shù)據就不一緻了。

在分布式事務技(jì)術(shù)中,有(yǒu)實現最終一緻性這麽一說,意思就是隻要我能保證兩邊數(shù)據最終實現了一緻性就行(xíng),不一定要使用事務。這樣說來(lái)就有(yǒu)方案了。如倉庫子系統在處理(lǐ)采購入庫時(shí)需要增加入庫單數(shù)據和(hé)更新庫存數(shù)據等多(duō)個(gè)表。這多(duō)個(gè)表都在倉庫子系統中,我們可(kě)以使用一個(gè)本地事務來(lái)保證倉庫子系統中的表數(shù)據一緻性。然後調用采購子系統更新采購單裏的入庫數(shù)量。為(wèi)了防止這個(gè)過程突然中斷導緻調用失敗,我們考慮增加一個(gè)消息隊列中間(jiān)件如ActiveMQ。如果接口返回失敗我們就往MQ裏寫入這個(gè)處理(lǐ)請(qǐng)求,等到采購子系統恢複正常後,MQ通(tōng)知采購子系統處理(lǐ)這個(gè)更新操作(zuò)。由于消息消費掉以後不會(huì)再有(yǒu)通(tōng)知了,采購子系統處理(lǐ)過程中發生(shēng)異常導緻更新失敗,需要将問題寫入本地的日志(zhì)庫,以便通(tōng)知管理(lǐ)員做(zuò)後續補償處理(lǐ)。就這樣通(tōng)過各種辦法來(lái)達到數(shù)據的最終一緻性即可(kě)。雖然聽(tīng)上(shàng)去有(yǒu)點坑,但(dàn)這就是解決方案。沒有(yǒu)其他更好的了。或者更新失敗後重新調用倉庫子系統回滾入庫單和(hé)庫存數(shù)據,達到最終一緻性!如圖所示:


如何在開(kāi)發ERP中使用“分布式”、“服務化”技(jì)術(shù)

更多(duō)erp相關,請(qǐng)點擊百度搜索:ERP

傲鵬ERP系統二維碼

常見問答(dá)

  • 我們有(yǒu)微商城,可(kě)以與你(nǐ)們的erp對接不?

    要看微商城有(yǒu)沒有(yǒu)開(kāi)放接口,如果有(yǒu)就可(kě)以,我們現已與點點客做(zuò)了對接

  • 我們用了金蝶的erp,我們想保留金蝶的财務,換專業的生(shēng)産型erp,你(nǐ)們可(kě)以不?

    我們的erp與金蝶用友(yǒu)的财務做(zuò)了接口,你(nǐ)們可(kě)以繼續使用現在的财務系統,生(shēng)産供應鏈用傲鵬erp,更多(duō)詳情請(qǐng)咨詢顧問

  • 你(nǐ)們實施erp一般是多(duō)久?

    這個(gè)要你(nǐ)看購買多(duō)少(shǎo)模塊,一般都要三個(gè)月以上(shàng),主要要看你(nǐ)們的基礎資料的準備的情況的,管理(lǐ)規劃,标準化程度的公司實施就很(hěn)快的,三個(gè)月都能上(shàng)線

  • 你(nǐ)們ERPr的與用友(yǒu)ERP,哪個(gè)好?

    這個(gè)抽象了,用友(yǒu)很(hěn)多(duō)産品線的,我們專注一個(gè)産品,與鼎捷易飛一個(gè)檔次,我們性價比高(gāo)

  • 我們沒有(yǒu)用過ERP,不知如何選erp,你(nǐ)們能幫我們嗎?

    可(kě)以的,我們可(kě)以上(shàng)門(mén)進行(xíng)診斷,分析企業現狀,建議你(nǐ)上(shàng)什麽ERP,詳情請(qǐng)與我們的顧問聯系13822145811

  • 我想實現每個(gè)部門(mén)變成一個(gè)獨立公司來(lái)經營,你(nǐ)們erp能實現?

    可(kě)以,我們叫虛拟公司,實際上(shàng)是一套帳,但(dàn)要劃出N多(duō)公司來(lái)考核

相關評論

  • 來(lái)自[廣州客戶]的點評

    傲鵬ERP很(hěn)好的,很(hěn)适合我們制(zhì)造型企業

  • 來(lái)自[廣州客戶]的點評

    傲鵬的上(shàng)門(mén)服務天數(shù)超過約定的天數(shù),要另收費,不好,不收錢(qián)就好了,顧問還(hái)不錯

  • 來(lái)自[廣州客戶]的點評

    傲鵬的生(shēng)産可(kě)以,财務就一般般羅

  • 來(lái)自[浙江客戶]的點評

    現在傳統的制(zhì)造業的ERP隻是強調內(nèi)部的制(zhì)造管理(lǐ),關于客戶管理(lǐ)這快比較弱,我公司是個(gè)以業務牽頭的公司,客戶的管理(lǐ)和(hé)跟進是我們目前管理(lǐ)的重點。如果用兩套系統管理(lǐ),那(nà)麽在CRM下一次單,...

  • 來(lái)自[江西客戶]的點評

    我們是國企,用了傲鵬的系統,他們的系統很(hěn)穩定,縣領導都沒滿意,價格很(hěn)便宜,服務也不錯

  • 來(lái)自[湖(hú)南客戶]的點評

    用了傲鵬的ERP後,我們算(suàn)計(jì)件工資又快又準,而且成品的成本更加好算(suàn)出來(lái)了,不再像以前那(nà)樣稀裏糊塗的了

上(shàng)一篇:已經沒有(yǒu)了下一篇:已經沒有(yǒu)了

erp系統開(kāi)發相關文章