本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon SQS 公平佇列的運作方式
Amazon SQS 公平佇列會透過防止單一租用戶降低其他租用戶的訊息處理速度,自動減輕多租用戶佇列中的雜訊鄰近影響。當公平佇列偵測到一個租用戶正在使用佇列取用者容量的不成比例份額時,他們會優先交付來自安靜租用戶的訊息。
租戶識別
公平佇列會依每個訊息上的 MessageGroupId 屬性來識別租用戶。共用相同 的訊息MessageGroupId屬於相同的租用戶。公平佇列可以包含含和不含 的混合訊息MessageGroupId。每個沒有 的訊息MessageGroupId都會視為屬於自己的不同租用戶。
我們建議您使用映射到系統中實體的識別符,例如客戶 ID、用戶端應用程式 ID 或請求類型,在您傳送到公平佇列的每個訊息MessageGroupId上設定 。
偵測的運作方式
Amazon SQS 使用兩種方法偵測雜訊鄰近:
-
並行共用 — 租戶的傳輸中訊息佔佇列中所有傳輸中訊息的一小部分。這可偵測一次處理許多訊息的租用戶,無論是由於高傳送量、慢速處理或兩者。
-
處理時間份額 — 租用戶最近佔總消費者處理時間的份額。這可偵測訊息數量很少但處理速度緩慢的租戶,因此租戶佔用了大量消費者時間,而不會同時有許多訊息。
當下列任一情況為 true 時,租用戶會標記為雜訊鄰近:
-
並行共享:租戶佔佇列中傳輸中訊息的 10% 以上,且至少有 30 個自己的訊息正在傳輸中。
-
處理時間共享:租戶最近佔總消費者處理時間的份額超過 10%。
由於 Amazon SQS 是分散式系統,這些閾值為近似值,因此偵測可能不會在所述的確切值中啟用。
訊息傳遞順序如何變更
一旦偵測到租戶是嘈雜的鄰居,Amazon SQS 會優先從安靜的租戶傳送訊息。每當有安靜租用戶訊息可用時,輪詢訊息的消費者執行個體會收到來自安靜租用戶的訊息。此優先順序會繼續,直到雜訊鄰的並行共享和處理時間共享下降到與安靜租戶相當的層級。
不會捨棄或調節雜訊鄰近訊息。他們的駐留時間會增加,而安靜租戶訊息會排定優先順序,並在其待處理項目清除後恢復正常。當沒有安靜租戶訊息等待時,消費者執行個體會像平常一樣收到雜訊鄰近訊息。
如果同時偵測到多個租用戶為雜訊鄰,消費者執行個體會先收到來自雜訊租用戶的訊息,其中包含最少的傳輸中訊息。這有助於平衡噪音租用戶的處理時間。
當有雜訊的鄰居變得安靜時
當下列任一情況成立時,租用戶不會再被視為雜訊鄰近:
-
已完全消耗租戶的待處理項目。
-
租用戶沒有訊息連續傳輸 5 分鐘。
之後,租戶的訊息不會再取消優先順序,並視為與任何其他安靜租戶的訊息相同。
消費者容量考量
為了讓並行共享措施有效運作,您的消費者需要同時處理足夠的訊息,讓一個租用戶的傳輸中訊息共享可以脫穎而出。調整取用者機群大小時,請考量這一點。
透過事件來源映射使用 Lambda 做為取用者時,傳輸中訊息的數量取決於 Lambda 函數並行和批次大小。在調整取用者大小時,一起評估這些設定。
當傳輸中的訊息數量太低而無法觸發並行共享閾值時,處理時間共享量值仍然可以偵測雜訊鄰近。不過,當消費者同時處理足夠的訊息,以便評估這兩個量值時,公平佇列最有效。