本小節將討論影響效能的流量控制運作方式 (請參閱用戶端執行階段配置)。請將這些運作方式配置為連線工廠受管理物件的屬性。如需有關設定連線工廠屬性的資訊,請參閱第 8 章, 管理受管理物件。
用戶端傳送和接收的訊息 (有效負載訊息) 與 Message Queue 控制訊息,都會透過用戶端與代理程式之間的相同連線進行傳送。如果有效負載訊息的傳送阻擋了控制訊息,則會造成控制訊息 (例如代理程式確認) 延遲傳送。若要避免此擁塞狀況,Message Queue 會計算連線上的有效負載訊息流量。
有效負載訊息分為多個批次 (如連線工廠屬性 imqConnectionFlowCount 所指定),因此只傳送已設定數目的有效負載訊息。批次傳送後,會暫停傳送有效負載訊息,而只傳送擱置的控制訊息。接著傳送其他有效負載訊息,然後傳送擱置控制訊息,重複此循環。
如果用戶端正在進行需要代理程式大量回應的作業,則 imqConnectionFlowCount 的值應保持較低:例如,如果用戶端正在使用 CLIENT_ACKNOWLEDGE 或 AUTO_ACKNOWLEDGE 模式、永久性訊息、作業事件或佇列瀏覽器,或者正在新增或移除用戶。而另一方面,如果用戶端在連線上只有簡易用戶,並且使用 DUPS_OK_ACKNOWLEDGE 模式,則您可以增加 imqConnectionFlowCount 的值,而不會影響效能。
在達到本機資源限制 (例如記憶體限制) 之前,Message Queue 用戶端執行階段可處理的有效負載訊息數目也會有所限制。到達此限制時,會對效能造成影響。因此,Message Queue 會限制每個用戶 (或每個連線) 在連線中傳送的訊息數目,以及在用戶端執行階段中進行緩衝以等待使用的訊息數目。
如果傳送到用戶端執行階段的有效負載訊息數超過了為任何用戶所設定的 imqConsumerFlowLimit 值,則會停止傳送訊息給該用戶。只有在傳送給該用戶的未使用訊息數低於此 imqConsumerFlowThreshold 設定值時,才會重新繼續傳送訊息。
以下範例說明這些限制的使用:考量主題用戶的設定值:
imqConsumerFlowLimit=1000 imqConsumerFlowThreshold=50
建立用戶時,代理程式會不間斷傳送第一批 1000 個訊息 (假設存在這些訊息) 給該用戶。傳送這 1000 個訊息之後,代理程式會停止傳送,直到用戶端執行階段要求傳送更多訊息。應用程式處理這些訊息前,用戶端執行階段會保留這些訊息。在要求代理程式傳送下一個批次之前,用戶端執行階段會允許應用程式使用至少 50% (imqConsumerFlowThreshold) 的訊息緩衝容量 (即 500 個訊息)。
在相同情況下,如果臨界值為 10%,則在要求傳送下一個批次之前,用戶端執行階段會等待應用程式至少使用 900 個訊息。
以下計算下一個批次的大小:
imqConsumerFlowLimit - (current number of pending msgs in buffer)
因此,如果imqConsumerFlowThreshold 為 50%,則下一個批次大小可介於 500 到 1000 之間,其實際數量取決於應用程式處理訊息的速度。
如果 imqConsumerFlowThreshold 設定過高 (接近 100%),則代理程式會嘗試傳送較小的批次,以降低訊息流量。如果該值過低 (接近 0%),則在代理程式傳送下一組批次之前,用戶端也許能完成處理其餘的緩衝訊息,這也會造成訊息流量下降。一般而言,除非您有特定的效能或可靠性考量,否則不需要變更 imqConsumerFlowThreshold 屬性的預設值。
用戶型流量控制 (尤其是 imqConsumerFlowLimit ) 是管理用戶端執行階段中記憶體的最佳方法。通常,根據用戶端應用程式,您會知道您在任何連線上需要支援的用戶數目、訊息容量和可用於用戶端執行階段的總記憶體容量。
然而,在一些用戶端應用程式中,用戶數目可能是不確定的,它取決於一般用戶的選擇。在此情況下,您仍可以使用連線層級流量限制來管理記憶體。
連線層級流量控制可限制連線上所有用戶的緩衝訊息總數。如果此數目超過 imqConnectionFlowLimit 的值,則會停止透過連線傳送訊息,直到總數目低於連線限制為止。(只有將 imqConnectionFlowLimitEnabled 設定為 true,才會啟用 imqConnectionFlowLimit 屬性。)
階段作業中形成佇列的訊息數目為使用階段作業之用戶數目及用於每個用戶之訊息負載的函數。如果用戶端在產生和使用訊息中發生延遲,通常您可以藉由重新設定應用程式,以分發較大階段作業數目上的訊息產生器和用戶,或者分發較大連線數目上的階段作業,並因此改善效能。