NMS.ActiveMQ 非同步傳送
背景
Apache.NMS.ActiveMQ 支援以同步或非同步模式將訊息傳送到 Broker。使用的模式對傳送呼叫的延遲有很大的影響。由於延遲通常是生產者可以實現的吞吐量的一個巨大因素,因此使用非同步傳送可以顯著提高系統的效能。
好消息是,在某些情況下,Apache.NMS.ActiveMQ 預設以非同步模式傳送訊息。僅在 JMS 規範要求使用同步傳送的情況下,我們才會預設使用同步傳送。我們被迫以同步模式傳送的情況是當在交易之外傳送持久訊息時。
如果您未使用交易且正在傳送持久訊息,則每次傳送都是同步的,並會阻塞直到 Broker 將訊息已安全地持久化到磁碟的確認訊息發回給生產者。此確認訊息保證訊息不會遺失,但由於客戶端被阻塞,也會產生巨大的延遲代價。
許多高效能應用程式被設計為可容忍在故障情況下少量訊息遺失。如果您的應用程式是以這種方式設計的,您可以啟用非同步傳送的使用,即使在使用持久訊息時也可以提高吞吐量。
使用連線 URI 配置非同步傳送
您可以使用連線設定 URI 來配置非同步傳送,如下所示
var cf = new ConnectionFactory("tcp://locahost:61616?nms.AsyncSend=true");
在 ConnectionFactory 層級配置非同步傳送
您可以使用屬性在 Apache.NMS.ActiveMQ.ConnectionFactory 物件上啟用此功能。
((ConnectionFactory)connectionFactory).AsyncSend = true;
在連線層級配置非同步派送
在此層級配置非同步傳送設定會覆蓋連線工廠層級的設定。
您可以使用屬性在 Apache.NMS.ActiveMQ.Connection 物件上啟用此功能。
((Apache.NMS.ActiveMQ.Connection)connection).AsyncSend = true;