趙業(yè)海
(柳州五菱汽車工業(yè)有限公司,廣西 柳州545007)
柳州五菱以生產(chǎn)和銷售微型汽車零部件、發(fā)動(dòng)機(jī)和專用車為主要業(yè)務(wù)的汽車及零部件制造企業(yè),是中國(guó)汽車工業(yè)30強(qiáng)、中國(guó)制造業(yè)企業(yè)500強(qiáng)、全國(guó)大型工業(yè)企業(yè)500強(qiáng)和信息化企業(yè)500強(qiáng)之一。
在柳州五菱信息化規(guī)劃模型中,將信息系統(tǒng)描述為包括計(jì)劃層、執(zhí)行層和控制層的三層模型,如圖1所示。企業(yè)資源規(guī)劃(ERP系統(tǒng))需要實(shí)時(shí)的生產(chǎn)信息來(lái)輔助做出經(jīng)營(yíng)決策,但來(lái)自現(xiàn)場(chǎng)狀態(tài)的實(shí)時(shí)信息和生產(chǎn)數(shù)據(jù)不能直接反應(yīng)出決策經(jīng)營(yíng)者所需的準(zhǔn)備數(shù)據(jù),包括計(jì)劃執(zhí)行進(jìn)度、物料庫(kù)存、質(zhì)量狀況、設(shè)備狀態(tài)等信息。生產(chǎn)制造執(zhí)行系統(tǒng)作為中間的執(zhí)行層,它的目標(biāo)就是要實(shí)現(xiàn)優(yōu)化運(yùn)行、優(yōu)化控制及優(yōu)化管理,起承上啟下、運(yùn)籌調(diào)度的中樞作用,其作為生產(chǎn)過程系統(tǒng)的基礎(chǔ)數(shù)據(jù)處理平臺(tái),具有的功能應(yīng)包括:生產(chǎn)調(diào)度、過程資源配置、物料監(jiān)控、質(zhì)量管理、過程數(shù)據(jù)采集、流程模擬、模型計(jì)算及過程優(yōu)化等。因此,需要通過系統(tǒng)集成,收集所有相關(guān)物料、資源的信息及時(shí)、準(zhǔn)確地反應(yīng)到ERP上層。
圖1 系統(tǒng)業(yè)務(wù)分布層次圖
目前我公司信息系統(tǒng)主要包括PLM、ERP、MES、WMS、QMS、主數(shù)據(jù)管理、數(shù)據(jù)采集和控制等多個(gè)信息系統(tǒng),系統(tǒng)間的數(shù)據(jù)準(zhǔn)確實(shí)時(shí)交換是實(shí)現(xiàn)智能制造的前提。作為SOA核心技術(shù)的ESB提供了綜合、靈活而且一致的集成方法。隨著企業(yè)智能制造信息系統(tǒng)應(yīng)用的深入,如何做好系統(tǒng)集成成為信息化建設(shè)的關(guān)鍵點(diǎn)。通過對(duì)集成以及ESB集成平臺(tái)的討論,闡述了構(gòu)建智能制造ESB集成設(shè)計(jì)的方法,并形成構(gòu)建ESB平臺(tái)的頂層設(shè)計(jì)。
企業(yè)服務(wù)總線(簡(jiǎn)稱ESB),作為一種耦合的服務(wù)和應(yīng)用之間的集成方式,是當(dāng)今先進(jìn)的企業(yè)應(yīng)用整合方案。ESB作為SOA架構(gòu)的信息傳輸龍骨,能夠幫助簡(jiǎn)化IT架構(gòu)(減少應(yīng)用整合接口的數(shù)量和復(fù)雜程度),降低運(yùn)作成本,自動(dòng)實(shí)現(xiàn)系統(tǒng)之間、部門之間甚至廠家之間的應(yīng)用集成,從而降低企業(yè)應(yīng)用集成的難度和成本,提升業(yè)務(wù)靈活性和市場(chǎng)響應(yīng)速度(Time to market),最終提升企業(yè)的競(jìng)爭(zhēng)優(yōu)勢(shì)[1]。
借鑒IBM等大型咨詢公司在汽車行業(yè)實(shí)施系統(tǒng)間數(shù)據(jù)集成的經(jīng)驗(yàn)及解決方案,公司制定基于企業(yè)服務(wù)總線(Enterprise Service Bus,簡(jiǎn)稱 ESB)的建設(shè)思路,解決了系統(tǒng)之間復(fù)雜的交互邏輯和復(fù)雜的交互技術(shù),圖2為柳州五菱個(gè)應(yīng)用系統(tǒng)數(shù)據(jù)集成規(guī)劃示意圖。
圖2 柳州五菱應(yīng)用系統(tǒng)接口規(guī)劃示意圖
使用任何技術(shù)和產(chǎn)品構(gòu)建的企業(yè)服務(wù)總線都應(yīng)包括下列主要功能包括:
路由器:根據(jù)信息內(nèi)容,在不同的應(yīng)用和服務(wù)之間進(jìn)行信息的傳輸和路由;
轉(zhuǎn)換器:進(jìn)行應(yīng)用之間的通信協(xié)議轉(zhuǎn)換;
翻譯機(jī):進(jìn)行應(yīng)用之間的消息格式轉(zhuǎn)換;
收發(fā)室:處理來(lái)自不同渠道的業(yè)務(wù)事件(同步傳輸、異步傳輸、發(fā)布/訂閱等方式)。
柳州五菱在產(chǎn)品選型過程中,試用過多個(gè)產(chǎn)品,最終選擇使用開源Mule-ESB產(chǎn)品搭建企業(yè)數(shù)據(jù)總線的多系統(tǒng)集成平臺(tái),確保公司內(nèi)部系統(tǒng)之間的數(shù)據(jù)交互以及公司對(duì)外業(yè)務(wù)數(shù)據(jù)交互能夠安全、可靠、及時(shí)的完成。
Mule ESB是一個(gè)基于Java的輕量級(jí)企業(yè)服務(wù)總線平臺(tái),并支持開源的產(chǎn)品,允許開發(fā)人員快速便利地連接多個(gè)應(yīng)用,并支持應(yīng)用間的數(shù)據(jù)交換。Mule ESB支持集成現(xiàn)有系統(tǒng)而無(wú)論其底層采用何種技術(shù),如 JMS、Web Services、JDBC、HTTP以及其他技術(shù)等。目前我公司使用JSON-RPC的通訊方式相同,JSON格式更加高效。
柳州五菱根據(jù)業(yè)務(wù)系統(tǒng)實(shí)施情況,結(jié)合公司整體信息系統(tǒng)集成規(guī)劃,總結(jié)出兩類接口設(shè)計(jì)流程,即業(yè)務(wù)數(shù)據(jù)接口系統(tǒng)交互流程和主數(shù)據(jù)接口系統(tǒng)交互圖流程(見圖 3、圖 4)。
1.3.1 業(yè)務(wù)數(shù)據(jù)接口系統(tǒng)交互流程
(1)ESB接收源系統(tǒng)的數(shù)據(jù)后將會(huì)保存到ESB數(shù)據(jù)庫(kù)(轉(zhuǎn)儲(chǔ)數(shù)據(jù)庫(kù) DumpDB)中,實(shí)時(shí)返回源系統(tǒng)的狀態(tài)為ESB的數(shù)據(jù)接收狀態(tài),而非目的系統(tǒng)的數(shù)據(jù)處理狀態(tài)。
(2)ESB異步方式將接收到的數(shù)據(jù)包原樣發(fā)送給目的系統(tǒng),目的系統(tǒng)實(shí)時(shí)返回?cái)?shù)據(jù)處理狀態(tài)。
(3)ESB將目的系統(tǒng)返回的數(shù)據(jù)處理狀態(tài)通過另一接口“處理結(jié)果返回接口”發(fā)送給源系統(tǒng)。
1.3.2 主數(shù)據(jù)接口系統(tǒng)交互圖流程
圖3 業(yè)務(wù)數(shù)據(jù)接口系統(tǒng)交互流程
(1)ESB定時(shí)按修改時(shí)間索引查詢讀取數(shù)據(jù)倉(cāng)庫(kù)(源系統(tǒng))中主數(shù)據(jù),并發(fā)送維目的系統(tǒng)。
(2)ESB每次僅發(fā)送1條數(shù)據(jù)給目的系統(tǒng)(按更改時(shí)間升序),目的系統(tǒng)在處理后返回相應(yīng)的處理結(jié)果。目的系統(tǒng)的處理可以是數(shù)據(jù)校驗(yàn)等操作。
圖4 主數(shù)據(jù)接口系統(tǒng)交互圖流程
(1)源系統(tǒng)發(fā)送的數(shù)據(jù)為JSON格式的數(shù)據(jù)包,其中包括1個(gè)必須字段“PackageID”用于唯一標(biāo)識(shí)數(shù)據(jù)包:
1)ESB僅確保同一個(gè)“PackageID”從源系統(tǒng)接收到的數(shù)據(jù)以及發(fā)送至目的系統(tǒng)的數(shù)據(jù)一致性,不對(duì)其內(nèi)容作解析;其內(nèi)容由源系統(tǒng)與目的系統(tǒng)協(xié)商確保業(yè)務(wù)的完整性及可用性。
2)源系統(tǒng)確保:相同數(shù)據(jù)其PackageID必須相同。如源系統(tǒng)在數(shù)據(jù)發(fā)送失敗下次重發(fā)時(shí),務(wù)必確保同一數(shù)據(jù)的PackageID相同。
3)原則上,1個(gè)數(shù)據(jù)包只包括1條業(yè)務(wù)數(shù)據(jù)。以便源、目的系統(tǒng)的數(shù)據(jù)發(fā)送狀態(tài)、處理結(jié)果的校驗(yàn)及返回。ESB不作強(qiáng)制要求及相關(guān)校驗(yàn)。
(2)與源系統(tǒng)關(guān)于數(shù)據(jù)發(fā)布接口約定
現(xiàn)在,“寶貝不哭”已成為全院的自覺行動(dòng)。無(wú)論何時(shí)何地,聽見孩子哭聲,醫(yī)生護(hù)士都會(huì)停下來(lái),看看孩子為什么哭?SPE組不再單槍匹馬,這是馬力最樂意看到的。
1)請(qǐng)求數(shù)據(jù)包格式:源系統(tǒng)主動(dòng)調(diào)用ESB發(fā)布數(shù)據(jù),以下是HTTP請(qǐng)求示例。
POST[URL]HTTP/1.1 Content-Type:text/xml;charset=utf-8 Content-Length:length{"PackageID":"XXXXXXXXXX",//必需。數(shù)據(jù)包ID,長(zhǎng)度在20個(gè)字節(jié)以內(nèi),英文+數(shù)字…… //以下為數(shù)據(jù)內(nèi)容}源系統(tǒng)務(wù)必確保"PackageID"作為JSON文本中的首字段,以避免不可預(yù)期的錯(cuò)誤。
2)響應(yīng)數(shù)據(jù)包格式:ESB在HTTP響應(yīng)中即時(shí)返回?cái)?shù)據(jù)接收結(jié)果,以下是HTTP響應(yīng)示例。
HTTP/1.1 200 OK Content-Type:text/xml;charset=utf-8 Content-Length:length{“status”:0,//必須,狀態(tài),0-異常,1-正常,2-重復(fù)數(shù)據(jù)"message":"",//非必須,異常時(shí)的錯(cuò)誤詳細(xì)描述"resend":"Y"http://非必須.Y則表示當(dāng)前數(shù)據(jù)包需要再次發(fā)送,反之應(yīng)為N或""或無(wú)此字段}
3)處理失敗重發(fā)Resend機(jī)制
A.源系統(tǒng)調(diào)用ESB時(shí),如HTTP調(diào)用成功(HTTPStatus=200),但由于ESB原因無(wú)法將數(shù)據(jù)包成功保存的,ESB將在返回信息中設(shè)置Resend=Y。
HTTP/1.1 200 OK Content-Type:text/xml;charset=utf-8 Content-Length:length{"status":0,//必須,狀態(tài),0-異常,1-正常,2-重復(fù)數(shù)據(jù)"message":"",//非必須,異常時(shí)的錯(cuò)誤詳細(xì)描述"resend":"Y"http://非必須.Y則表示當(dāng)前數(shù)據(jù)包需要再次發(fā)送,反之應(yīng)為N或""或無(wú)此字段}
B.源系統(tǒng)對(duì)于Resend=Y的,當(dāng)前作業(yè)將跳過此包繼續(xù)發(fā)送下一個(gè)包。這一個(gè)數(shù)據(jù)包將在Resend時(shí)間間隔之后再次重發(fā)失敗的數(shù)據(jù);如Resend多次后仍然失敗則不再發(fā)送此數(shù)據(jù)包。
C.建議調(diào)用方對(duì)以下連接參數(shù)設(shè)計(jì)為每個(gè)接口可配置不同參數(shù):Resend次數(shù)、Resend時(shí)間間隔。
D.對(duì)于數(shù)據(jù)順序要求極高不允許跳包發(fā)送的,需要在接口設(shè)計(jì)時(shí)由源系統(tǒng)、目的系統(tǒng)及ESB三方協(xié)商確定。
4)發(fā)送失敗重試Retry機(jī)制
B.發(fā)送失敗的數(shù)據(jù)不會(huì)被跳過,會(huì)在下次作業(yè)觸發(fā)時(shí)或Resend時(shí)間間隔之后再次發(fā)送直至達(dá)到最大失敗重試次數(shù)或直至成功。
C.建議源系統(tǒng)方對(duì)以下連接參數(shù)設(shè)計(jì)為每個(gè)接口可配置不同參數(shù):HTTP連接信息、超時(shí)時(shí)長(zhǎng),失敗重試次數(shù)、失敗重試間隔。
D.對(duì)于業(yè)務(wù)時(shí)效性極高不允許發(fā)送過期數(shù)據(jù)的,需要在接口設(shè)計(jì)時(shí)由源系統(tǒng)、目的系統(tǒng)及ESB三方協(xié)商確定。
5)數(shù)據(jù)重復(fù)性校驗(yàn)原則
A.源系統(tǒng)發(fā)出的數(shù)據(jù)包中必須包括“PackageID”作為數(shù)據(jù)包唯一性標(biāo)識(shí)。
B.ESB獲取數(shù)據(jù)包ID,將先解析獲取數(shù)據(jù)包的“PackageID”字段,并檢索轉(zhuǎn)儲(chǔ)庫(kù)中的歷史數(shù)據(jù)是否曾接收過。如已接收,則該數(shù)據(jù)包拋棄并返回錯(cuò)誤,具體如下:
HTTP/1.1 200 OK Content-Type:text/xml;charset=utf-8 Content-Length:length{"status":0,//必須,狀態(tài),0-異常,1-正常,2-重復(fù)數(shù)據(jù)"message":"",//非必須,異常時(shí)的錯(cuò)誤詳細(xì)描述"resend":"N"http://非必須.Y則表示當(dāng)前數(shù)據(jù)包需要再次發(fā)送,反之應(yīng)為N或""或無(wú)此字段}
(3)與目的系統(tǒng)關(guān)于數(shù)據(jù)訂閱接口約定
1)響應(yīng)數(shù)據(jù)包格式:目的系統(tǒng)在HTTP響應(yīng)中即時(shí)數(shù)據(jù)處理結(jié)果,以下是HTTP響應(yīng)示例。
HTTP/1.1 200 OK Content-Type:text/xml;charset=utf-8 Content-Length:length{"PackageID":"XXXXXXXXXX",//必須,當(dāng)前處理的數(shù)據(jù)包ID"status":1 //必須,狀態(tài),0-異常,1-正常,2-重復(fù)數(shù)據(jù)"message":"",//非必須,異常時(shí)的錯(cuò)誤詳細(xì)描述。成功時(shí)可為""或無(wú)此字段"billid":"",//單據(jù)ID"billno":"",//單據(jù)編號(hào)"resend":"Y"http://非必須.Y則表示當(dāng)前數(shù)據(jù)包需要再次發(fā)送,反之應(yīng)為N或""或無(wú)此字段}
2)處理失敗重發(fā)Resend機(jī)制
A.ESB調(diào)用目的系統(tǒng)時(shí),如HTTP調(diào)用成功(HTTPStatus=200),但由于目的系統(tǒng)原因無(wú)法成功處理且需要ESB再次發(fā)送數(shù)據(jù)的,目的系統(tǒng)將在返回信息中設(shè)置Resend=Y。
HTTP/1.1 200 OK Content-Type:text/xml;charset=utf-8 Content-Length:length{"PackageID":"XXXXXXXXXX",//必須,當(dāng)前處理的數(shù)據(jù)包ID"status":0,"message":"…",//詳細(xì)錯(cuò)誤信息"billid":"",//單據(jù)ID"billno":"",//單據(jù)編號(hào)"resend":"Y"}
B.ESB對(duì)于Resend=Y的,當(dāng)前作業(yè)將跳過此包繼續(xù)發(fā)送下一個(gè)包。這一個(gè)數(shù)據(jù)包將在Resend時(shí)間間隔之后再次重發(fā)失敗的數(shù)據(jù);如Resend多次后仍然失敗則不再發(fā)送此數(shù)據(jù)包。
C.ESB將對(duì)以下連接參數(shù)設(shè)計(jì)為每個(gè)接口可配置不同參數(shù):Resend次數(shù)、Resend時(shí)間間隔。
D.對(duì)于數(shù)據(jù)順序要求極高不允許跳包發(fā)送的,需要在接口設(shè)計(jì)時(shí)由源系統(tǒng)、目的系統(tǒng)及ESB三方協(xié)商確定。
3)發(fā)送失敗重試Retry機(jī)制
A.如ESB調(diào)用目的系統(tǒng)HTTP調(diào)用失敗(HTTP Status!=200)時(shí),ESB將會(huì)再次發(fā)送直至N次失敗后結(jié)束。
B.發(fā)送失敗的數(shù)據(jù)不會(huì)被跳過,會(huì)在下次作業(yè)觸發(fā)時(shí)或Resend時(shí)間間隔之后再次發(fā)送直至達(dá)到最大失敗重試次數(shù)或直至成功。
C.ESB將對(duì)以下連接參數(shù)設(shè)計(jì)為每個(gè)接口可配置不同參數(shù):HTTP連接信息、超時(shí)時(shí)長(zhǎng),失敗重試次數(shù)、失敗重試間隔。
D.對(duì)于業(yè)務(wù)時(shí)效性極高不允許發(fā)送過期數(shù)據(jù)的,需要在接口設(shè)計(jì)時(shí)由源系統(tǒng)、目的系統(tǒng)及ESB三方協(xié)商確定。
4)數(shù)據(jù)重復(fù)性校驗(yàn)機(jī)制
A.目的系統(tǒng)接收數(shù)據(jù)時(shí)需要先校驗(yàn)該數(shù)據(jù)包PackageID是否曾經(jīng)接收/處理過。如已接收,則該數(shù)據(jù)包拋棄并返回錯(cuò)誤,具體如下:
HTTP/1.1 200 OK Content-Type:text/xml;charset=utf-8 Content-Length:length{"status":0,"message":"重復(fù)數(shù)據(jù)"http://或其他詳細(xì)描述信息"message":"…",//詳細(xì)錯(cuò)誤信息"billid":"",//單據(jù)ID"billno":""http://單據(jù)編號(hào)}
(4)與源系統(tǒng)關(guān)于數(shù)據(jù)處理結(jié)果返回接口的約定
ESB從目的系統(tǒng)獲得數(shù)據(jù)處理返回結(jié)果后,將主動(dòng)調(diào)用源系統(tǒng)發(fā)送數(shù)據(jù)處理結(jié)果。HTTP請(qǐng)求與目的系統(tǒng)返回ESB時(shí)一致。
1)響應(yīng)數(shù)據(jù)包格式:源系統(tǒng)在HTTP響應(yīng)中即時(shí)接收結(jié)果,以下是HTTP響應(yīng)示例。
HTTP/1.1 200 OK Content-Type:text/xml;charset=utf-8 Content-Length:length{“status”:0,//必須,狀態(tài),0-異常,1-正常"message":"",//非必須,異常時(shí)的錯(cuò)誤詳細(xì)描述"resend":"Y"http://非必須.Y則表示當(dāng)前數(shù)據(jù)包需要再次發(fā)送,反之應(yīng)為N或""或無(wú)此字段}
2)ESB將從目的系統(tǒng)獲得的數(shù)據(jù)處理結(jié)果返回給源系統(tǒng)。但以下處理結(jié)果不發(fā)送:
A.失敗重發(fā)的數(shù)據(jù)("resend":"Y")。
B.重復(fù)數(shù)據(jù)("status":2)。
3)處理失敗重發(fā)Resend機(jī)制
A.ESB調(diào)用源系統(tǒng)時(shí),如HTTP調(diào)用成功(HTTPStatus=200),但源系統(tǒng)異常無(wú)法成功記錄返回狀態(tài)信息的,源系統(tǒng)將在返回信息中設(shè)置Resend=Y。
HTTP/1.1 200 OK Content-Type:text/xml;charset=utf-8 Content-Length:length{"status":0,"message":"…",//詳細(xì)錯(cuò)誤信息,一般為JAVA/SQL拋出錯(cuò)誤信息"resend":"Y"}
B.ESB對(duì)于Resend=Y的,當(dāng)前作業(yè)將跳過此包繼續(xù)發(fā)送下一個(gè)包。這一個(gè)數(shù)據(jù)包將在Resend時(shí)間間隔之后再次重發(fā)失敗的數(shù)據(jù);如Resend多次后仍然失敗則不再發(fā)送此數(shù)據(jù)包。
C.建議調(diào)用方對(duì)以下連接參數(shù)設(shè)計(jì)為每個(gè)接口可配置不同參數(shù):Resend次數(shù)、Resend時(shí)間間隔。
D.對(duì)于數(shù)據(jù)順序要求極高不允許跳包發(fā)送的,需要在接口設(shè)計(jì)時(shí)由源系統(tǒng)、目的系統(tǒng)及ESB三方協(xié)商確定。
4)發(fā)送失敗重試Retry機(jī)制
A.如ESB調(diào)用源系統(tǒng) HTTP調(diào)用失?。℉TTPStatus!=200)時(shí),ESB將會(huì)嘗試再次發(fā)送直至N次失敗后結(jié)束。
B.發(fā)送失敗的數(shù)據(jù)不會(huì)被跳過,會(huì)在下次作業(yè)觸發(fā)時(shí)或Resend時(shí)間間隔之后再次發(fā)送直至達(dá)到最大失敗重試次數(shù)或直至成功。
C.ESB將對(duì)以下連接參數(shù)設(shè)計(jì)為每個(gè)接口可配置不同參數(shù):HTTP連接信息、超時(shí)時(shí)長(zhǎng),失敗重試次數(shù)、失敗重試間隔。
本文針對(duì)汽車制造企業(yè)的業(yè)務(wù)特點(diǎn)和信息化集成現(xiàn)狀,提出基于數(shù)據(jù)內(nèi)容路由的企業(yè)服務(wù)總線框架,該框架基于面向服務(wù)的思想、其松散耦合的體系架構(gòu)和可重用的服務(wù)能為企業(yè)節(jié)約信息化管理成本。基于規(guī)則引擎的消息內(nèi)容路由機(jī)制,使集成系統(tǒng)在面對(duì)同一服務(wù)調(diào)用需要跨越多個(gè)應(yīng)用系統(tǒng)時(shí),能更快地對(duì)業(yè)務(wù)規(guī)則變化做出及時(shí)的響應(yīng)。在此框架基礎(chǔ)上實(shí)現(xiàn)了汽車制造企業(yè)數(shù)據(jù)集成平臺(tái)中的信息集成服務(wù)模塊,能自動(dòng)實(shí)現(xiàn)企業(yè)數(shù)據(jù)應(yīng)用集成,相比傳統(tǒng)的應(yīng)用集成方式有明顯優(yōu)勢(shì)。