本主題提供 Windows Communication Foundation (WCF) 中佇列通訊的建議做法。 下列各節將討論案例觀點的建議做法。
快速、Best-Effort 佇列傳訊
對於需要佇列傳訊所提供的隔離以及快速且高效能傳訊且有最佳努力保證的情境,請使用非交易式佇列,並將ExactlyOnce屬性設定為false
。
此外,您可以選擇不產生磁碟寫入的成本,方法是將 Durable 屬性設定為 false
。
安全性對效能有影響。 如需詳細資訊,請參閱 效能考慮。
可靠的端對端佇列傳訊
下列各節說明需要端對端可靠傳訊之案例的建議做法。
基本可靠傳輸
若要取得端對端可靠性,請將 屬性設定 ExactlyOnce 為 true
以確保傳輸。
Durable屬性可以設定為 true
,或false
視您的需求而定(預設值為 true
)。 一般而言,作為端到端可靠性的一部分,Durable 屬性會設為 true
。 妥协是有性能上的代价,但使訊息具持久性,因此當佇列管理員當機時,訊息不會遺失。
使用交易
您必須使用交易來確保端對端可靠性。
ExactlyOnce
保證只會確保訊息會傳遞至目標佇列。 若要確保已收到訊息,請使用交易。 如果沒有交易,如果服務當機,您就會遺失正在傳遞但實際傳遞至應用程式的訊息。
使用寄不出的信件佇列
死信佇列可確保當訊息無法傳遞至目標佇列時,您會收到通知。 您可以使用系統提供的死信佇列或自訂死信佇列。 一般而言,使用自訂的死信佇列是最佳做法,因為這樣您可以將一個應用程式中的死信訊息傳送到單一死信佇列中。 否則,所有在系統上執行的應用程式所產生的死信訊息都會被傳送到單一佇列。 然後,每個應用程式都必須搜尋死信佇列,以尋找與該應用程式相關的死信訊息。 有時候,使用自訂死信佇列可能不可行,例如在使用 MSMQ 3.0 的情況下。
不建議關閉用於端對端可靠通訊的死信佇列。
如需詳細資訊,請參閱 使用 Dead-Letter 佇列來處理訊息傳輸失敗。
使用 Poison-Message 處理
毒性訊息處理提供從無法處理訊息的失敗中復原的能力。
使用有害訊息處理功能時,請確定 ReceiveErrorHandling 屬性已設定為適當的值。 將它設定為 Drop 表示數據遺失。 另一方面,將它設定為 Fault 會使服務主機在偵測到有害訊息時發生錯誤。 使用 MSMQ 3.0 是 Fault 避免數據遺失並將有害訊息移出的最佳方式。 建議使用 MSMQ 4.0 的方法是 Move。 Move 將有害訊息移出佇列,讓服務可以繼續處理新的訊息。 有害訊息服務接著可以個別處理有害訊息。
如需詳細資訊,請參閱 有害訊息處理。
達到高吞吐量
若要在單一端點上達到高輸送量,請使用下列方法:
交易批處理。 交易批處理可確保可以在單一交易中讀取許多訊息。 這會優化交易提交,提高整體效能。 批次處理所涉及的成本在於,如果某個批次中的單一訊息出現失敗,整個批次都會被回滾,而訊息必須逐一處理,直到再次能安全進行批次處理為止。 在大部分情況下,有害訊息很少見,因此批處理是增加系統效能的慣用方式,特別是當您有其他參與交易的資源管理員時。 如需詳細資訊,請參閱 在交易中進行訊息的批次處理。
並行。 並行會增加輸送量,但並行也會影響共用資源的爭用。 如需詳細資訊,請參閱 併發。
限速 為了達到最佳效能,請限制調度管線中的訊息數目。 如需了解如何執行此操作的範例,請參閱 節流。
使用批處理時,請注意並行和節流會轉譯為並行批次。
若要達到更高的輸送量和可用性,請使用一群從佇列讀取的 WCF 服務。 這需要所有這些服務在相同的端點上公開相同的合約。 伺服器群組方法最適合訊息生產速率高的應用程式,因為它可讓許多服務從同一個佇列中讀取。
在使用伺服器叢集時,請注意 MSMQ 3.0 不支援遠端交易性讀取。 MSMQ 4.0 支援遠端交易讀取。
如需詳細資訊,請參閱 在交易中進行訊息的批次處理。
使用工作單位語意進行佇列
在某些情況下,佇列中的訊息群組可能會相關,因此,這些訊息的順序相當重要。 在這種情況下,將一組相關訊息作為單一交易單位進行處理:要麼所有訊息都被成功處理,要麼全部皆未處理。 若要實作這類行為,請使用具有佇列的會話。
如需詳細資訊,請參閱 群組會話中的佇列訊息。
Request-Reply 訊息的相互關聯
雖然佇列通常是單向的,但在某些情況下,您可能會想要將收到的回復與稍早傳送的要求相互關聯。 如果您需要這類相互關聯,建議您套用自己的SOAP訊息標頭,其中包含與訊息的相互關聯資訊。 通常,傳送者會附加此標頭與訊息,以及接收者在處理訊息,並在回復佇列上使用新訊息回復時,附加寄件人的訊息標頭,其中包含相互關聯資訊,讓寄件者可以使用要求訊息來識別回復訊息。
與非 WCF 應用程式整合
將 WCF 服務或用戶端與非 WCF 服務或用戶端整合時,請使用 MsmqIntegrationBinding
。 非 WCF 應用程式可以是使用 System.Messaging、COM+、Visual Basic 或 C++所撰寫的 MSMQ 應用程式。
使用 MsmqIntegrationBinding
時,請注意下列事項:
WCF 訊息本文與 MSMQ 訊息本文不同。 使用佇列系結傳送 WCF 訊息時,WCF 訊息本文會放在 MSMQ 訊息內。 MSMQ 基礎結構會忘記這項額外資訊;它只會看到 MSMQ 訊息。
MsmqIntegrationBinding
支援熱門串行化類型。 根據串行化類型,泛型訊息 MsmqMessage<T>的本文類型會採用不同的類型參數。 例如, ByteArray 需要MsmqMessage\<byte[]>
和 Stream 需要MsmqMessage<Stream>
。透過 XML 串行化,您可以使用
KnownTypes
屬性來指定已知型<別,然後用來判斷如何還原串行化 XML 訊息。