Sun Java System Message Queue 3.7 UR1 管理指南

訊息流量限制

在達到本機資源限制 (例如記憶體限制) 之前,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 屬性。)

階段作業中形成佇列的訊息數目為使用階段作業之用戶數目及用於每個用戶之訊息負載的函數。如果用戶端在產生和使用訊息中發生延遲,通常您可以藉由重新設定應用程式,以分發較大階段作業數目上的訊息產生器和用戶,或者分發較大連線數目上的階段作業,並因此改善效能。