來源:傲鵬ERP 發(fā)布時間:2019-01-05 10:13:17 點擊:330269次 作者:傲鵬erp文工
自主開發(fā)ERP系統(tǒng),系統(tǒng)主要功能模塊無非是訂單管理、商品管理、生產(chǎn)采購、倉庫管理、物流管理、財務管理等等。作為一個管理系統(tǒng),大家的一般開發(fā)習慣就是使用.Net或Java技術(shù),建立一個單塊(單進程)架構(gòu)的應用,只有一個SQLServer或MySql數(shù)據(jù)庫。然后在項目文件中分一下各個模塊,三層結(jié)構(gòu)方式組織代碼編寫開發(fā)。最后測試,交付上線。開始因為數(shù)據(jù)量不大,系統(tǒng)性能還不錯,各種列表查詢,報表查詢,Excel數(shù)據(jù)導出功能等用的都很流暢。但是隨著公司業(yè)務發(fā)展,訂單量日積月累,后期各種業(yè)務部門的報表查詢、數(shù)據(jù)導出需求不斷增多,我們漸漸就感覺系統(tǒng)運行越來越慢。起初解決想法優(yōu)化數(shù)據(jù)庫。我們可能的一種嘗試就是將數(shù)據(jù)庫單獨放置到一個服務器,實現(xiàn)數(shù)據(jù)庫和應用程序分離,或者是建立各種數(shù)據(jù)庫表索引,優(yōu)化程序代碼等方法。經(jīng)過這樣優(yōu)化,系統(tǒng)某些功能可能性能的確大大提高,但是我們還是發(fā)現(xiàn)某些功能列表的數(shù)據(jù)查詢導出依然很慢,或者隨著數(shù)據(jù)量繼續(xù)積累,原來較快的列表導出功能,也愈來愈變得緩慢了。有人會說拆分。但ERP系統(tǒng)并發(fā)量不高,主要是業(yè)務復雜,各種業(yè)務耦合度遠高于那些互聯(lián)網(wǎng)應用,數(shù)據(jù)查詢邏輯要遠比互聯(lián)網(wǎng)系統(tǒng)復雜,一個列表頁查詢出來的數(shù)據(jù),往往需要關(guān)聯(lián)4、5張表才能得到結(jié)果。有些報表類的甚至更多。加上各種業(yè)務操作事務性、數(shù)據(jù)一致性要求很高,無法拆分。
解決方法是采用互聯(lián)網(wǎng)思維我們不要去做一個大一統(tǒng)的系統(tǒng)了。把他們一個個小系統(tǒng)。然后通過系統(tǒng)接口讓這些小系統(tǒng)相互通信。這樣來組成一個大系統(tǒng),具體來說就是“分布式”、“服務化”的互聯(lián)網(wǎng)思維。讓系統(tǒng)在架構(gòu)設計上就是一個先天支持高度可擴展的系統(tǒng)。
怎么做呢?具體來說就是要將訂單管理、商品管理、生產(chǎn)采購、倉庫管理、物流管理、財務管理拆分成一個個子系統(tǒng)。這些子系統(tǒng)可以單獨設計開發(fā),對外暴露出各種其他子系統(tǒng)需求的數(shù)據(jù)接口即可。每個子系統(tǒng)都有單獨的數(shù)據(jù)庫。甚至這些子系統(tǒng)可以交由不同的團隊去開發(fā)和維護,使用不同的技術(shù)體系,使用不同的數(shù)據(jù)庫。而不是再像以前那樣,都集成在同一個大而全的系統(tǒng)中,一個大而全的數(shù)據(jù)庫。他有什么優(yōu)點呢?
以往數(shù)據(jù)庫實例只有一個,沒法擴展出多個實例,以便在性能受限的情況下依靠增加數(shù)據(jù)庫實例來達到負載均衡。也許有人會說可以使用讀寫分離方案,但是因為ERP系統(tǒng)的特點,這個方案很多時候不現(xiàn)實。比如說操作庫存的時候,你不能從讀庫里讀庫存,然后在寫庫里寫入庫存。因為主從復制會有時效性,寫入的庫存并不能馬上寫入從庫。這樣的場景在ERP中也有多處。何況寫庫不能擴展,只能有一個。而新設計方案是寫庫是分離的,每個子系統(tǒng)有自己的數(shù)據(jù)庫。
各個子系統(tǒng)以后臺微服務的方式存在。前臺一個單獨的web項目,這個web項目調(diào)用后臺這些子系統(tǒng)的服務接口。這樣的設計,在某個業(yè)務子系統(tǒng)需要更新的時候,可以單獨更新。不用像以前那種單進程架構(gòu)時,一個小更新需要整個系統(tǒng)重啟,導致用戶會話也丟失,用戶需要新登錄。而現(xiàn)在的這種設計就不會有這個問題。
系統(tǒng)物理部署視圖
拆分應用層
拆分應用層,是踐行“微服務”架構(gòu)的理念。將原來大而全的單進程架構(gòu)按照業(yè)務模塊拆分成可獨立部署的應用程序,以此來達到平滑系統(tǒng)更新、升級、方便負載擴展的目的。具體來說,技術(shù)上可以使用restfull風格的接口,也可以使用像java中dubbo框架方式來簡化開發(fā)復雜度。ERPWeb端或其他移動端也是一個單獨的應用充當表現(xiàn)層。非常薄,只是簡單的接受參數(shù),調(diào)取后臺其他各種微服務程序的接口獲取所需展示的數(shù)據(jù)。微服務充當業(yè)務邏輯層,每個微服務都是可獨立部署上線的程序,對外提供數(shù)據(jù)訪問接口。
微服務可以使用流行的各種RPC框架,比如dubbo,可以支持多種調(diào)用協(xié)議Http、TCP等,這些框架使得編碼比較容易,框架封裝底層數(shù)據(jù)通信細節(jié),使得客戶端執(zhí)行遠程方法如同執(zhí)行本地方法一樣簡單。
dubbo微服務架構(gòu),還支持服務治理,負載均衡等功能。這樣不僅可以提高系統(tǒng)的可用性,還能動態(tài)提升系統(tǒng)應用層的性能。比如倉庫管理中入庫業(yè)務非常繁忙,占用非常多的CPU和內(nèi)存資源,我們可以另外加一臺機器,單獨再部署一個倉庫管理服務上去。這樣使得整個系統(tǒng),有兩個倉庫管理服務在同時工作,平衡負載。而這一切都是在服務注冊中心,比如Zookeeper下自動完成的。
微服務結(jié)構(gòu),天生很好的支持系統(tǒng)更新升級操作。比如財務模塊有個新需求需要上線,我們只需要替換財務模塊的服務重啟即可。這對已經(jīng)登錄系統(tǒng)的用戶來說,沒有多少影響,不用重新登陸系統(tǒng),其他模塊服務使用也不受影響。
拆分數(shù)據(jù)層
數(shù)據(jù)庫瓶頸是ERP系統(tǒng)的永久之傷。大量復雜的數(shù)據(jù)查詢表連接邏輯充斥著整個系統(tǒng)。數(shù)據(jù)庫垂直拆分成功的關(guān)鍵就是如何重新設計系統(tǒng)數(shù)據(jù)層各個模塊相互耦合的問題。能解決這個問題,永久之傷便可以解決了。
我們先來看一個典型數(shù)據(jù)層模塊耦合問題。需求是展示物料庫存,列表字段:物料編號、物料名稱、品類、倉庫、數(shù)量
物料表:
庫存表:
品類和倉庫表省略。。。
很顯然,傳統(tǒng)一個數(shù)據(jù)庫中,我們只需要簡單的join操作,即可關(guān)聯(lián)這兩張表,外加關(guān)聯(lián)品類和倉庫表即可查詢出我們所要的數(shù)據(jù)。但是現(xiàn)在我們的架構(gòu)中,物料表和商品表不在同一個數(shù)據(jù)庫實例中,我們不能使用join操作了,那我們該怎么實現(xiàn)需求呢?
新的架構(gòu),只允許我們通過對方的服務接口來獲取數(shù)據(jù),不能直接關(guān)聯(lián)對方服務的私有數(shù)據(jù)庫。至少從架構(gòu)上,服務化角度來說不能直接訪問對方服務的數(shù)據(jù)庫。這種情況下,假設web模塊子系統(tǒng)調(diào)用倉庫子系統(tǒng)來獲取數(shù)據(jù),則我們需要在倉庫模塊中創(chuàng)建一個service方法來裝配這些數(shù)據(jù)。然后返回給web子系統(tǒng)。如下圖所示,倉庫管理方法首先獲取本地庫存表的物料編碼、和倉庫表的倉庫名稱字段信息,并且分頁完后最終準備返回20條數(shù)據(jù)到Web模塊前,將這20條數(shù)據(jù)中的物料ID作為參數(shù)請求商品模塊子系統(tǒng),商品子系統(tǒng)返回這20個物料ID相關(guān)的商品信息給到倉庫管理模塊,然后倉庫管理模塊重新組裝上列表所需的物料名稱和品類兩個字段數(shù)據(jù),實現(xiàn)最終要返回給Web子系統(tǒng)的數(shù)據(jù)。
也許你會說,這太麻煩了,這種方法的性能肯定沒有直接join來的高,解決不了性能問題。咋看起來好像是這么回事,但是仔細考慮看看,在系統(tǒng)并發(fā)量低、數(shù)據(jù)量小、業(yè)務不算繁忙的環(huán)境下,的確性能還不如傳統(tǒng)一個數(shù)據(jù)中join方式來的快速。但我們想想以后吧!我們現(xiàn)在的架構(gòu)設計是將一個數(shù)據(jù)庫拆成多個數(shù)據(jù)庫,每個數(shù)據(jù)庫可以運行在單獨的服務器上去,這樣以后就能負載數(shù)據(jù)庫的壓力了。整體來說這樣才能不會讓數(shù)據(jù)庫成為未來業(yè)務繁忙時候的性能瓶頸了。想想都覺得讓人興奮不已,是不是?
這時候有人又會問,那以后系統(tǒng)數(shù)據(jù)量、業(yè)務更大了,連你這個拆分成幾個數(shù)據(jù)庫還不夠用怎么辦呢?我的方法是,可以基于拆分的數(shù)據(jù)庫,單獨每個庫可以做讀寫分離、使用緩存等。甚至可以繼續(xù)拆分下去,將子系統(tǒng)再次拆分成多個孫子系統(tǒng)。視業(yè)務模塊繁忙程度而定。
有人又會問,有些列表查詢邏輯非常復雜,關(guān)聯(lián)十多張表,如果按上述方法拆分數(shù)據(jù),那簡直是災難啊!是的,你說的沒有錯。這種情況下我的方案是將這種更加復雜的報表級別的數(shù)據(jù)查詢展示需求,可以單獨做個報表系統(tǒng)。報表數(shù)據(jù)庫設計采用數(shù)據(jù)倉庫方式。為了更高的讀取性能,我們可以將數(shù)據(jù)庫表設計成很多冗余字段方式也就是反范式設計,以及建立非常多的組合索引。
這種系統(tǒng)成功的關(guān)鍵就是數(shù)據(jù)和主ERP系統(tǒng)業(yè)務庫的同步問題了。一般可以寫一個定時同步程序,將ERP主業(yè)務系統(tǒng)的數(shù)據(jù)經(jīng)過帥選、轉(zhuǎn)化等方式直接生成報表視圖所需的最終或中間數(shù)據(jù),簡化關(guān)聯(lián)查詢。報表系統(tǒng)也可以采用微服務架構(gòu)設計。如下圖所示:
如果報表所需的數(shù)據(jù)要求實時的,我們可以讓ERP系統(tǒng)業(yè)務操作時,觸發(fā)同步數(shù)據(jù)的請求,實時同步至報表庫。
也許有人又又問了,ERP系統(tǒng)很多操作都要求事務性,你拆分系統(tǒng)后怎么實現(xiàn)事務性,保障數(shù)據(jù)一致性呢?
這個問題很好,也是我決定寫這篇文章前思考的最后一個問題。在微服務架構(gòu)中,實現(xiàn)夸服務的事務并不容易,至少不像本地應用使用本地數(shù)據(jù)庫事務那樣方便,性能高效,數(shù)據(jù)一致性好。
也許你聽過分布式事務這個概念。有兩種情景,一種是一個應用中使用多個數(shù)據(jù)庫,為保障數(shù)據(jù)一致性,需要使用分布式事務。還有一種情況就是針對我們這個架構(gòu)而言的。微服務環(huán)境下的分布式事務,具體來說打個比方。采購入庫這個操作設計在倉庫管理服務中。入庫后,需要更新采購子系統(tǒng)中的采購單中的入庫數(shù)量。這個過程要求數(shù)據(jù)一致性,也就是采購單入庫成功后寫入了庫存表中的數(shù)量,同時要更新采購單表中的入庫數(shù)量。我們不能直接在倉庫服務中去訪問采購服務中的數(shù)據(jù)庫,必須通過采購服務提供的服務接口才行。如果這樣,我們怎么能保證數(shù)據(jù)一致性呢?因為很有可能庫存表寫入成功,但調(diào)取采購服務寫入采購單數(shù)據(jù)時失敗了??赡苁蔷W(wǎng)絡問題原因?qū)е碌模@樣數(shù)據(jù)就不一致了。
在分布式事務技術(shù)中,有實現(xiàn)最終一致性這么一說,意思就是只要我能保證兩邊數(shù)據(jù)最終實現(xiàn)了一致性就行,不一定要使用事務。這樣說來就有方案了。如倉庫子系統(tǒng)在處理采購入庫時需要增加入庫單數(shù)據(jù)和更新庫存數(shù)據(jù)等多個表。這多個表都在倉庫子系統(tǒng)中,我們可以使用一個本地事務來保證倉庫子系統(tǒng)中的表數(shù)據(jù)一致性。然后調(diào)用采購子系統(tǒng)更新采購單里的入庫數(shù)量。為了防止這個過程突然中斷導致調(diào)用失敗,我們考慮增加一個消息隊列中間件如ActiveMQ。如果接口返回失敗我們就往MQ里寫入這個處理請求,等到采購子系統(tǒng)恢復正常后,MQ通知采購子系統(tǒng)處理這個更新操作。由于消息消費掉以后不會再有通知了,采購子系統(tǒng)處理過程中發(fā)生異常導致更新失敗,需要將問題寫入本地的日志庫,以便通知管理員做后續(xù)補償處理。就這樣通過各種辦法來達到數(shù)據(jù)的最終一致性即可。雖然聽上去有點坑,但這就是解決方案。沒有其他更好的了?;蛘吒率『笾匦抡{(diào)用倉庫子系統(tǒng)回滾入庫單和庫存數(shù)據(jù),達到最終一致性!如圖所示:
更多erp相關(guān),請點擊百度搜索:ERP
全新開發(fā)成本相當高,現(xiàn)在ERP已經(jīng)相當成熟了,你的需求我們基本上可以滿足,我們也可以在現(xiàn)在ERP基礎(chǔ)上進行二次開發(fā)滿足你個性化需求
可以,1.你們要先上好erp,數(shù)據(jù)準確后,我們采用BI系統(tǒng)來實現(xiàn)阿米巴經(jīng)營分析系統(tǒng),詳情致電顧問13822145811
傲鵬普及型ERP(OpenERP)仍然秉承‘標準、簡單、易用’的設計指導方針,面向小型企業(yè),規(guī)范企業(yè)的基本業(yè)務流程,實現(xiàn)部門間信息共享,解決核心的物料管理與財務管理問題
我們備份機制是建議在sql數(shù)據(jù)庫的機制,建議你備份要多重保障,數(shù)據(jù)庫備份,異地備份,手工備份等
這個要看國外有沒有屏蔽中國的網(wǎng)路,象我們不能訪問國外網(wǎng)站那,通過vpn解決
從自身檢討,把你的情況列出來,找我們的顧問咨詢一下
傲鵬的生產(chǎn)可以,財務就一般般羅
傲鵬ERP加上BPM后,真正做到全面流程化了
我真心的說一下,傲鵬的界面真的不行,但功能不錯,邏輯性相當強,開關(guān)也太多了,完全要靠顧問,我一不小心設錯,就會出不來數(shù)據(jù)的
我們是上市公司,也是用的傲鵬的erp,從10年開始,用了好多年了,唯一不足的不能集團模式,不能做到一個帳套多個公司的
我公司經(jīng)過兩個月的ERP選型,從軟件的實用性,穩(wěn)定性、擴展性還有性價比來說都是最好的選擇,最終選擇跟傲鵬合作,并成功上線,在這里給傲鵬點贊
我們五金機械企業(yè),我們有自己的機加車間,但有些工序需要發(fā)外處理,同一個產(chǎn)品有可能需要多次發(fā)外不同加工商,我以前用的也是國內(nèi)大牌的ERP,他們有委外加工的功能,但需要建立很多編碼,bom...