在前面一個專題中,我們列出了一個ESB系統(tǒng)所需要關(guān)心的所有方面的關(guān)鍵組件,這里介紹其中的Message Channels所關(guān)注的問題及相關(guān)的模式。
Message Channel主題之下包含以下模式,分別用于解決channel中不同方面的問題:
l Point-to-Point Channel
l Publish-Subscribe Channel
l Datatype Channel
l Invalid Message Channel
l Dead Letter Channel
l Guaranteed Delivery
l Channel Adapter
l Messaging Bridge
l Message Bus
當(dāng)兩個應(yīng)用需要交換數(shù)據(jù),它們通過連接兩端的channel來發(fā)送數(shù)據(jù)。發(fā)送的應(yīng)用可能不知道哪個應(yīng)用將接受數(shù)據(jù)。然而,通過選擇特定的channel來發(fā)送,發(fā)送者知道接受者將是守候在channel另一端等待數(shù)據(jù)的應(yīng)用之一。通過這種方式,生產(chǎn)數(shù)據(jù)的應(yīng)用有了一個同數(shù)據(jù)消費者通訊的途徑。
Message Channels面對的各個主要問題:
如果一個應(yīng)用要傳輸或接受數(shù)據(jù),它一定會用到一個channel。問題是你的應(yīng)用要知道要使用什么樣的channel,以及用它來做什么。
固定的channel集合 - Channel中討論的一個主題是,一個應(yīng)用可用的Message Channel集合一般是固定的。設(shè)計一個應(yīng)用時,一個開發(fā)者必須知道將某種類型的數(shù)據(jù)放到哪里可以同其他應(yīng)用共享該數(shù)據(jù),以及從什么地方可以找到其他應(yīng)用的特定數(shù)據(jù)。這些通訊路徑不會在運行期動態(tài)的創(chuàng)建和發(fā)現(xiàn);它們需要在設(shè)計期間就確定下來,以便應(yīng)用知道它的數(shù)據(jù)從哪里來以及數(shù)據(jù)將去哪里。( 雖然大多數(shù)channel必須被靜態(tài)定義使正確的,但是也有例外,有些情況下動態(tài)channel是很好用的。一個例外就是Request-Reply模式中的reply channel。請求者可以創(chuàng)建或者獲得一個應(yīng)答者不知道的新的channel,并在請求消息中指定該channel為Return Address,應(yīng)答者就可以使用它。另外一個例外是支持集成channels的消息系統(tǒng)實現(xiàn)。一個接受者可以訂閱一個集成體系的根channel,然后發(fā)送者可以發(fā)布消息到一個子channel,而接受者不需要知道子channel,仍然會收到消息。這些都是不常見的情況,channel通常仍然是在部署之前被定義,并且應(yīng)用被設(shè)計連接到一個已知的channel集合 )。
決定channel的集合 - 一個相關(guān)的主題是,誰決定那些Message Channel是可用的 - message系統(tǒng)還是應(yīng)用程序?換句話說,是由消息系統(tǒng)確定一些channel,然后要求應(yīng)用程序使用它們?還是應(yīng)用決定它們需要什么channel,然后要求消息系統(tǒng)提供它們?這個問題沒有一個簡單的答案,設(shè)計必須的channel集合是迭代的。首先,應(yīng)用要決定消息系統(tǒng)提供哪些channel。然后應(yīng)用將圍繞這些channel設(shè)計它們的通訊,但是如果這樣是不可行的,它們將需要添加額外的channel。當(dāng)一些應(yīng)用已經(jīng)使用了一個確定的channel集合,當(dāng)加入新的應(yīng)用,它們將使用已存在的channel。當(dāng)為應(yīng)用添加新的功能,它們需要新的channel。
單向channel - 另外一個經(jīng)常引起混淆的是一個Message channel是單向的還是雙向的。技術(shù)上來說,兩者都不是,一個channel更像是一個桶,一個應(yīng)用放入數(shù)據(jù),另外一個應(yīng)用從中取出數(shù)據(jù)。但是由于數(shù)據(jù)是放在消息中從一個應(yīng)用傳到另一個,這使得channel具有方向性,使它變成單向的。如果一個channel是雙向的,應(yīng)用將從中發(fā)送和接受數(shù)據(jù),雖然技術(shù)上是可行的,但是會有小小的問題,應(yīng)用將有可能持續(xù)的取出自己放進去的希望發(fā)送給其他應(yīng)用的消息。所以,為了實踐性的目的,channel是單向的。作為結(jié)論,兩個應(yīng)用如果有雙向通訊,它們需要兩個channel,每個方向一個。
如何使用Message channels:
現(xiàn)在我們來討論以下如何使用channel。
一對一或者一對多 - 當(dāng)你的應(yīng)用共享一些數(shù)據(jù),你希望只將它共享給一個應(yīng)用還是對它感興趣的所有應(yīng)用?要傳送數(shù)據(jù)到一個單獨的應(yīng)用,使用Point-to-Point Channel。這并不意味著發(fā)送到這個channel的每個數(shù)據(jù)都發(fā)送給同樣的接受者,因為一個channel可能有多個接受者。它意味著,實際上,保證每個數(shù)據(jù)都被同一個應(yīng)用接收。如果你想讓所有接收應(yīng)用都能接收數(shù)據(jù),使用Publish-Subscribe Channel。當(dāng)你通過這種方式發(fā)送數(shù)據(jù),channel將高效的復(fù)制數(shù)據(jù)到每一個接收者。
什么類型的數(shù)據(jù) - 任何內(nèi)存中的數(shù)據(jù)都有一個類型。另一方面,所有數(shù)據(jù)都是一些bytes集合。消息系統(tǒng)工作同這類似,消息內(nèi)容必須符合某些類型以便接受者了解數(shù)據(jù)的結(jié)構(gòu)。Datatype Channel認為在一個channel中的數(shù)據(jù)必須擁有同樣的類型。這也是為什么消息系統(tǒng)需要很多channel的主要原因(每個channel一種格式)。如果數(shù)據(jù)可以是任意的格式,那么消息系統(tǒng)在兩個應(yīng)用之間只需要兩條channel。
無效的和過期的消息 - 消息系統(tǒng)可以確定消息被正確的傳輸,但是它不能保證接受者知道如何處理它。接收者對數(shù)據(jù)格式和意義存在期望。當(dāng)它接收到一個不符合期望的消息,它什么也不能做。它們能作的,就是將這個陌生的消息放入到一個特別設(shè)計的Invalid Message Channel并希望某些監(jiān)控這個channel的工具能夠取出這個消息,并指出該如何處置它們。許多消息系統(tǒng)有一個類似的內(nèi)建特征,一個Dead Letter Channel,用來存放成功送出但卻無法成功投遞的消息。另外,一個系統(tǒng)管理工具應(yīng)該監(jiān)視Dead Letter Channel并且決定如何處置這些無法投遞的消息。
故障檢測 - 如果一個消息系統(tǒng)發(fā)生故障或停機維護,它的消息會怎樣?當(dāng)它重啟并重新運行,它的消息能否還在它的channel中?默認的:不會;channel將消息存儲在內(nèi)存中。然而,Guaranteed Delivery將channel持久化以便將它們的消息存儲到硬盤上。這會影響效率,但會使消息更加可靠,即使消息系統(tǒng)是不可靠的。
非消息客戶端 - 如果一個應(yīng)用不能連接到一個消息系統(tǒng)但是仍然想要參與消息怎么辦?通常它只能自認倒霉了,但是如果消息系統(tǒng)可以通過某種方式連接到應(yīng)用系統(tǒng) - 通過它的用戶界面,它的service API,它的數(shù)據(jù)庫,或者一個TCP/IP或HTTP這樣的網(wǎng)絡(luò)連接 - 那么消息系統(tǒng)可以使用一個Channel Adapter。這允許你連接到一個或多個連接到應(yīng)用的channel而不必改變應(yīng)用或者可能也不需要一個同應(yīng)用運行在同一個機器上的消息客戶端。有時‘非消息客戶端’真的是一個消息客戶端,但是只有連接的是其他消息系統(tǒng)的時候。
通訊中樞 - 隨著越來越多的企業(yè)應(yīng)用系統(tǒng)連接到消息系統(tǒng)以便通過消息暴露他們的功能,消息系統(tǒng)變成了企業(yè)中一站式功能的集散地。一個應(yīng)用只需簡單的知道用哪個channel來請求功能,以及從哪個監(jiān)聽結(jié)果。消息系統(tǒng)本質(zhì)上變成一個消息總線,一個提供所有企業(yè)應(yīng)用甚至變化中的應(yīng)用和功能的中樞。你可以更快速的集成。
如你所見,使用消息構(gòu)建應(yīng)用不僅僅是將他們連接到消息系統(tǒng)并發(fā)送消息。消息必須使用Message Channel來發(fā)送。Channel必須被設(shè)計為某個目的服務(wù),比如基于被共享的數(shù)據(jù)類型,共享數(shù)據(jù)的應(yīng)用類型,和接收數(shù)據(jù)的應(yīng)用。