簡體   English   中英

如何使用 SQS(亞馬遜簡單隊列服務)實現優先隊列

[英]How to implement a priority queue using SQS(Amazon simple queue service)

我遇到了 msg 失敗的情況,我想使用 python boto 包以最高優先級重播該 msg,因此他將首先被占用。 如果我沒記錯的話 SQS 隊列不支持優先隊列,所以我想實現一些簡單的東西。

重要說明:當 msg 失敗時,我不再擁有消息對象,我只保留receipt_handle 以便我可以刪除消息(如果重試次數超過 x 次)/更改超時可見性以將他推回隊列。

謝謝!

我認為沒有任何方法可以使用單個 SQS 隊列來做到這一點。 您無法控制消息的傳遞,因此無法對消息施加優先級。 如果你找到了一種方法,我很想聽聽。

我認為您可能會使用兩個隊列(或更一般的 N 個隊列,其中 N 是優先級的數量),但如果您在確定它失敗時實際上沒有消息對象,那么即使這似乎也是不可能的。 您將需要消息對象,以便將數據寫入高優先級隊列。

我不確定這實際上是否有資格作為答案 8^)

據我所知,AWS SQS 不提供原生方式或做優先隊列(單隊列優先)。 如果您願意考慮其他選擇,RabbitMQ 可以做到這一點。 客戶端可以在消息中指定 0-255 的優先級,隊列將優先考慮優先級較高的消息首先到達客戶。

更多信息請查看https://www.rabbitmq.com/priority.html

“當消息失敗時”,如果您的意思是“處理失敗”,那么您可以查看 SQS 附帶的死信隊列 (DLQ) 功能。 您可以設置接收計數閾值以將失敗的消息移動到 DLQ。 每個 DLQ 都與一個 SQS 相關聯。

在您的情況下,您可以使“最大接收計數”= 1 並單獨處理該消息

查看原始問題,我們需要有一個優先重試隊列,這意味着:

  • 隊列中的項目應該被優先處理,因為低優先級的項目可能依賴於高優先級的項目,例如只有在成功處理高優先級的項目后才能成功處理低優先級的項目;
  • 我們需要為隊列項實現多次重試;

在這種情況下,是的,我們可以使用帶有一些不太重要的假設的 SQS。

  1. 假設您的消息采用 JSON 格式,並且包含一個 Priority 字段。 將其添加到您的 SQS。
  2. 在消費者處,獲取消息,對其進行處理,如果失敗,則將可見性超時設置為(優先級)*(60 分鍾)隊列
  3. 為隊列設置 maxReceiveCount 等於您需要的重試次數或配置保留期以在特定重試次數后將消息移至死信隊列。

所以,理論上,低優先級的請求一開始可能只在高優先級之前執行一次,然后它會使用可見性超時“移動到”高優先級消息之后。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM