開發(fā)一個基于消息的解決方案是不容易的事情,在生產(chǎn)中操作這樣一個產(chǎn)品同樣也是一個挑戰(zhàn):一個基于消息的集成解決方案一天可以產(chǎn)生、路由和轉(zhuǎn)換成千上萬的消息。我們不得不處理異常、效率瓶頸或改變合作系統(tǒng)。而為了使事情變得更加有挑戰(zhàn)性,組件經(jīng)常被分布在不同的平臺和機器上,甚至位于不同的地理位置。
System Management包含以下幾種模式
l Control Bus
l Detour
l Wire Tap
l Message History
l Message Store
l Smart Proxy
l Test Message
l Channel Purger
除了與生據(jù)來的復(fù)雜性、分布式集成的規(guī)模以及個性化的應(yīng)用之外,低耦合的架構(gòu)使得測試和debug變得更加困難。Martin Fowler將這個癥狀稱為“架構(gòu)師的夢想,開發(fā)者的夢魘”。低耦合的架構(gòu)原則以及間接的依賴于外部系統(tǒng)提供了靈活性。然而,測試一個消息生產(chǎn)者不了解消息消費者的系統(tǒng)可能會是一個挑戰(zhàn)。另外異步的和時間相關(guān)的消息使得事情變的更加復(fù)雜。舉例來說,消息方案可能被設(shè)計沒有被成消息生產(chǎn)者者必須從接受者那里得到一個回應(yīng)。同樣的消息基礎(chǔ)設(shè)施通常保證傳輸消息,但不能保證傳輸時間。這是的開發(fā)基于消息傳送結(jié)果的測試用例變得困難。
當(dāng)監(jiān)控一個消息解決方案,我們可以在兩個抽象層面上跟蹤消息流。一個典型的系統(tǒng)管理方案監(jiān)控多少消息被發(fā)送或者它多長時間得到一個被處理的消息。這些監(jiān)控方案不檢查消息數(shù)據(jù),除了可能會檢查消息頭中的幾個字段(比如消息標(biāo)識或者消息歷史)。與之相對的,BAM(business activity monitoring)方案聚焦于包含在消息中的有效數(shù)據(jù),舉例來說,發(fā)生在過去一小時的所有訂單的金額。System Management中的很多模式都足夠通用并可以用在以上兩個目的中(監(jiān)控消息頭或者消息內(nèi)容)。然而,由于BAM本身就是一個新領(lǐng)域,并且需要從數(shù)據(jù)倉庫中獲得很多數(shù)據(jù)(有些我們根本就沒有涉及到),我們決定在系統(tǒng)管理的內(nèi)容中討論這些模式。
系統(tǒng)管理模式被設(shè)計用于為保持一個基于消息的復(fù)雜系統(tǒng)的運轉(zhuǎn)所提出的需求并提供工具。System Management的模式涉及三個種類:監(jiān)控和控制,觀察和分析消息流量,測試和調(diào)試。
監(jiān)控和控制
一個Control Bus提供一個單獨的控制點來對一個分布式方案進(jìn)行監(jiān)控和管理。它將多個組件連接到一個中心管理控制臺,這里可以顯示每個組件的狀態(tài)并且監(jiān)控通過每個組件的消息流量。控制臺同時也可以用于發(fā)送控制命令給組件,比如,轉(zhuǎn)變消息流。
我們可能想要在路由消息時添加附加的步驟,比如驗證或者日志。由于這些步驟可能使效率降低,所以我們可以通過Control Bus來控制他們開關(guān)。一個Detour為我們提供這種能力。
觀察和分析消息流量
有時我們想要在不影響主要消息流的情況下觀察消息的內(nèi)容。一個Wire Tap允許我們接入到消息流中。
當(dāng)我們調(diào)試一個基于消息的系統(tǒng),知道一個特定的消息在哪使很有幫助的。Message History保留一個消息訪問過的所有組件的日志,而不需要增加組件間的依賴。
然而Message History依賴于單獨的消息,一個中心的Message Store可以提供一個穿越系統(tǒng)的每個消息的完整記錄。結(jié)合Message History,Message Store可以分析所有消息穿過系統(tǒng)的可能路徑。
Wire Tap, Message History, 和Message Store幫助我們分析異步的消息流。為了跟蹤發(fā)送到請求-應(yīng)答service的消息,我們需要在消息流中插入一個Smart Proxy。
測試和調(diào)試
在部署前測試一個消息系統(tǒng)是一個非常好的注意。但是測試不應(yīng)該停止在部署前。你應(yīng)該有能力驗證正在運行的消息系統(tǒng)運行持續(xù)的運行正常。你可以周期性的發(fā)送一個Test Message到系統(tǒng)中并驗證結(jié)果。
當(dāng)一個組件失敗或者運行不正常,它可以簡單的終止,并放棄一個channel中的剩余消息。在測試期間這是很有用的。一個Channel Purger可以為我們做這些。