在前面的關(guān)鍵組件中我們提到了Messages。當(dāng)兩個(gè)應(yīng)用想要交換數(shù)據(jù),他們將數(shù)據(jù)包裝在一個(gè)message中。但是一個(gè)Message Channel不能傳輸原始數(shù)據(jù),它只能傳輸包含在一個(gè)message中的數(shù)據(jù)(即傳輸特定格式的數(shù)據(jù))。
Message在消息系統(tǒng)中處于信息載體的位置,而在ESB中,還消息識(shí)別、序列以及生存周期等職責(zé)。
Message的結(jié)構(gòu)涉及以下幾個(gè)模式:
l Command Message
l Document Message
l Event Message
l Request-Reply
l Return Address
l Correlation Identifier
l Message Sequence
l Message Expiration
l Format Indicator
創(chuàng)建和發(fā)送一個(gè)Message產(chǎn)生以下幾個(gè)問題:
消息意圖 - Message最終是為了運(yùn)送一些數(shù)據(jù),但是發(fā)送者可能有其他目的,比如它希望接受者使用消息做些事情。它可以發(fā)送一個(gè)Command Message,指定它希望調(diào)用的接受者上的函數(shù)或方法。發(fā)送者告訴接受者運(yùn)行那些代碼。發(fā)送者可以發(fā)送一個(gè)Document Message來傳送它的數(shù)據(jù)結(jié)構(gòu)到接受者。發(fā)送者發(fā)送數(shù)據(jù)到接受者,但是不指定接受者應(yīng)該做什么。
或者它可以發(fā)送一個(gè)Event Message,通知接受者發(fā)送者那里有一個(gè)改變。發(fā)送者不應(yīng)告訴接受者應(yīng)該怎樣適應(yīng)這個(gè)改變,而只應(yīng)提供通知。
返回一個(gè)應(yīng)答 - 當(dāng)一個(gè)應(yīng)用發(fā)送一個(gè)消息,它通常期望得到一個(gè)回應(yīng)來確定消息被處理并提供一個(gè)結(jié)果。這是一個(gè)Request-Reply場(chǎng)景。Request通常是一個(gè)Command Message,而應(yīng)答是一個(gè)包含返回值或異常的Document Message。請(qǐng)求者應(yīng)該在請(qǐng)求中指定一個(gè)Return Address來告訴應(yīng)答者使用哪個(gè)通道來傳回應(yīng)答。請(qǐng)求者可能在一個(gè)處理過程中發(fā)送多個(gè)請(qǐng)求,所以應(yīng)答應(yīng)該包含一個(gè)Correlation Identifier來指出這個(gè)應(yīng)答對(duì)應(yīng)哪個(gè)請(qǐng)求。
有兩個(gè)Request-Reply場(chǎng)景需要注意;它們都包含了一個(gè)Command Message請(qǐng)求和一個(gè)對(duì)應(yīng)的Document Message應(yīng)答。在第一個(gè)場(chǎng)景中,Message RPC,請(qǐng)求不但要調(diào)用應(yīng)答者的函數(shù),而且期望一個(gè)返回值。這是RPC。另一個(gè)場(chǎng)景中,Message Query,請(qǐng)求者執(zhí)行一個(gè)查詢;應(yīng)答者執(zhí)行查詢并在應(yīng)答中返回結(jié)果。這是遠(yuǎn)程查詢。
大量的數(shù)據(jù) - 有時(shí)應(yīng)用想要傳送大量的數(shù)據(jù)結(jié)構(gòu),放入一個(gè)單獨(dú)的message里面不是很合適。在這種情況下,將他們分解成可管理的消息塊并將他們作為Message Sequence發(fā)送。這些消息必須按順序發(fā)送,以便接受者能夠充足原始數(shù)據(jù)結(jié)構(gòu)。
慢速消息 - 消息系統(tǒng)的一個(gè)問題是發(fā)送者通常不知道接受者要多久才能接受到消息。然而,消息的內(nèi)容可能是時(shí)間敏感的,所以如果消息在某一時(shí)間內(nèi)沒有被接受,它將被忽略并取消。在這種情況下,sender應(yīng)該使用Message Expiration來指定一個(gè)到期時(shí)間。如果消息系統(tǒng)在規(guī)定時(shí)間內(nèi)無法傳輸一個(gè)消息,應(yīng)該將它取消并刪除到Dead Letter Channel中。同樣的一個(gè)receiver接受到一個(gè)超出該時(shí)間點(diǎn)的消息,也要取消該消息。
總之,只選擇使用消息是不夠的。使一個(gè)消息工作的其他決定性因素來自于消息所要完成的任務(wù)。