NIO 傳輸參考
使用 ActiveMQ Classic > 設定傳輸 > ActiveMQ Classic 連線 URI > NIO 傳輸參考
NIO 傳輸與一般的 TCP 傳輸非常相似。不同之處在於它使用 NIO API 實作,這有助於提升效能和擴展性。NIO 僅為伺服器端傳輸選項。嘗試在客戶端使用它會實例化一般的 TCP 傳輸。
設定語法
nio://hostname:port?key=value
設定選項與 TCP 傳輸相同。
請注意,原始的 NIO 傳輸是使用 OpenWire 協定的 tcp 傳輸的替代方案。其他網路協定,例如 AMQP、MQTT、Stomp 等,也有它們自己的 NIO 傳輸實作。通常透過在協定字首加上「+nio」後綴來設定,例如
mqtt+nio://127.0.0.1:1883
所有協定特定的設定都應適用於 NIO 版本的傳輸。
調整 NIO 傳輸執行緒使用
使用 NIO 而不是一般版本傳輸的主要優勢之一是它具有更好的擴展性並可支援更多連線。此情境中的主要限制是系統正在使用的執行緒數量。在傳輸的阻塞實作中,每個連線使用一個執行緒。在 NIO 實作中,有一個共用的執行緒池將會承擔負載,因此連線數量與系統中使用的執行緒數量沒有直接關係。
您可以使用以下系統屬性(自 5.15.0 版本起可用)來調整傳輸使用的執行緒數量
屬性 | 預設值 | 描述 |
---|---|---|
org.apache.activemq.transport.nio.SelectorManager.corePoolSize | 10 | 即使執行緒處於閒置狀態,也要保留在池中的執行緒數量 |
org.apache.activemq.transport.nio.SelectorManager.maximumPoolSize | 1024 | 允許在池中的最大執行緒數量 |
org.apache.activemq.transport.nio.SelectorManager.workQueueCapacity | 0 | 在擴展池之前,最大工作佇列深度 |
org.apache.activemq.transport.nio.SelectorManager.rejectWork | false | 允許在達到容量時拒絕工作並發生 IOException,以便可以保留現有的 QOS |
如果您想要擴展您的訊息代理以支援數千個連線,您需要先找到 JVM 程序允許建立的執行緒數量限制。然後您可以將這些屬性設定為低於該值的值(訊息代理需要更多執行緒才能正常運作)。如需有關目的地執行緒使用以及如何限制這些執行緒的更多資訊,請查看 擴展佇列 或 此組態檔案。例如,您可以新增以下內容
ACTIVEMQ_OPTS="$ACTIVEMQ_OPTS -Dorg.apache.activemq.transport.nio.SelectorManager.corePoolSize=2000 -Dorg.apache.activemq.transport.nio.SelectorManager.maximumPoolSize=2000 -Dorg.apache.activemq.transport.nio.SelectorManager.workQueueCapacity=1024"
到啟動腳本中(例如 ${ACTIVEMQ_HOME}/bin/env
)以擁有一個固定的 2000 個執行緒池來處理連線。使用這樣的設定,訊息代理應能夠接受達到系統限制的連線數量。當然,接受連線只是故事的一部分,因此垂直擴展訊息代理還有其他限制。