本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon SQS 公平佇列
Amazon SQS 公平佇列會自動減輕包含來自客戶、用戶端應用程式或訊息類型等多個邏輯實體之訊息的多租戶佇列中的雜訊鄰近影響。在這些共用佇列環境中,一個關鍵的效能指標是駐留時間,測量訊息從到達到處理在佇列中花費的總時間。當一個租用戶透過發佈超過系統可處理的訊息在佇列中建立待處理項目時,公平佇列會將對其他租用戶停留時間的影響降至最低。
穩定狀態
下圖說明包含來自四個不同租用戶 (標記為 A、B、C 和 D) 訊息的多租用戶佇列。佇列以穩定狀態運作,當消費者在佇列中出現訊息時,就不會收到訊息待處理項目。所有租用戶的停留時間都很短。並非所有取用者容量都會在此穩定狀態下充分利用。

雜訊鄰近影響
當多租用戶佇列中的一個租用戶建立待處理項目,增加所有其他租用戶的訊息駐留時間時,就會產生雜訊鄰近影響。與其他租用戶相比,或者當消費者需要更長的時間來處理來自該特定租用戶的訊息時,租用戶可以傳送大量訊息,成為雜訊鄰。
此圖說明租用戶 A 流量增加如何在佇列中建立待處理項目。消費者忙於處理僅租用戶 A 的訊息,而其他租用戶的訊息在待處理項目中等待,導致所有租用戶的停留時間增加。

使用公平佇列緩解
Amazon SQS 透過在處理期間監控租用戶之間的訊息分佈 (「傳輸中」狀態) 來偵測雜訊鄰。當租用戶的傳輸中訊息數量不成比例時,Amazon SQS 會將該租用戶識別為雜訊鄰近,並排定其他租用戶的訊息傳遞優先順序。此方法可減少對其他租用戶的停留時間影響。
此圖說明 Amazon SQS 公平佇列如何解決雜訊鄰近問題。當一個租用戶 (租用戶 A) 變得嘈雜時,Amazon SQS 會優先從其他租用戶 (B、C 和 D) 傳回訊息。此優先順序有助於維持安靜租用戶 B、C 和 D 的低停留時間,同時租用戶 A 訊息的停留時間會提高,直到佇列待處理項目消耗而不影響其他租用戶為止。

注意
Amazon SQS 不會限制每個租用戶的耗用率。它可讓消費者在有消費者容量且佇列沒有要傳回的其他訊息時,接收來自雜訊鄰近租戶的訊息。如同 Amazon SQS 標準佇列,公平佇列允許幾乎無限制的輸送量,而且佇列中可以擁有的租用戶數量沒有限制。
FIFO 佇列的差異
FIFO 佇列透過限制每個租用戶的傳輸中訊息數量來維持嚴格的排序。雖然這樣可以防止雜訊的鄰近,但會限制每個租用戶的輸送量。公平佇列是專為多租戶案例所設計,其中高輸送量、低停留時間和公平資源分配是優先事項。公平佇列可讓多個消費者同時處理來自相同租用戶的訊息,同時協助所有租用戶維持一致的駐留時間。
使用公平佇列
您的訊息生產者可以透過在傳出訊息MessageGroupId
上設定 來新增租戶識別符:
// Send message with tenant identifier SendMessageRequest request = new SendMessageRequest() .withQueueUrl(queueUrl) .withMessageBody(messageBody) .withMessageGroupId("tenant-123"); // Tenant identifier sqs.sendMessage(request);
公平性功能會自動套用至具有 MessageGroupId 屬性之訊息的所有 Amazon SQS 標準佇列。它不需要對消費者程式碼進行任何變更,不會影響 API 延遲,也沒有任何輸送量限制。
公平佇列 CloudWatch 指標
Amazon SQS 提供額外的 CloudWatch 指標,協助您監控雜訊鄰近影響的緩解措施。例如,您可以將Approximate..InQuietGroups
指標與標準佇列層級指標進行比較。在特定租用戶的流量激增期間,一般佇列層級指標可能會顯示不斷增加的待處理項目或較舊的訊息存留期。不過,單獨查看安靜的群組,您可以識別大多數非雜訊的訊息群組或租戶不會受到影響。
您可以在下面找到一個範例,其中標準佇列待處理項目指標 (ApproximateNumberOfMessagesVisible) 因為有雜訊的租用戶而增加,而非雜訊租用戶 (ApproximateNumberOfMessagesVisibleInQuietGroups) 的待處理項目則保持低。

如需 Amazon SQS CloudWatch 指標及其說明的完整清單,請參閱 Amazon SQS 的 CloudWatch 指標。