非同步傳送
背景
ActiveMQ Classic 支援以同步或非同步模式將訊息傳送到訊息中介程式。所使用的模式對於傳送呼叫的延遲有很大的影響。由於延遲通常是生產者可以達成的吞吐量的一個重要因素,因此使用非同步傳送可以顯著提高系統效能。
好消息是,ActiveMQ Classic 在許多情況下預設以非同步模式傳送訊息。只有在 JMS 規範要求使用同步傳送的情況下,我們才會預設使用同步傳送。我們被迫以同步模式傳送的情況是在交易之外傳送持久性訊息時。
如果您未使用交易並傳送持久性訊息,則每次傳送都是同步的,並且會阻塞直到訊息中介程式已將確認訊息傳回給生產者,表示訊息已安全地保存到磁碟。此確認訊息提供了訊息不會遺失的保證,但也造成了巨大的延遲損失,因為用戶端被阻塞了。
許多高效能應用程式的設計旨在容忍在故障情況下少量訊息遺失。如果您的應用程式以這種方式設計,則即使在使用持久性訊息時,您也可以啟用非同步傳送以提高吞吐量。
使用連線 URI 設定非同步傳送
您可以使用連線設定 URI 設定非同步傳送,如下所示
cf = new ActiveMQConnectionFactory("tcp://locahost:61616?jms.useAsyncSend=true");
在 ConnectionFactory 層級設定非同步傳送
您可以使用屬性在ActiveMQConnectionFactory物件上啟用此功能。
((ActiveMQConnectionFactory)connectionFactory).setUseAsyncSend(true);
在連線層級設定非同步傳送
在此層級設定 dispatchAsync 會覆寫連線工廠層級的設定。
您可以使用屬性在ActiveMQConnection物件上啟用此功能。
((ActiveMQConnection)connection).setUseAsyncSend(true);