簡體   English   中英

處理后從SQS隊列中刪除消息

[英]Deleting messages from SQS queue after processing

我的應用程序將消息發送到AWS SQS隊列,以獲取需要某種后台處理的作業。 我的處理守護進程接收並處理這樣的消息:

$result = $sqsClient->receiveMessage([
    'QueueUrl' => \Myapp\Config::get('sqs.queue'),
    'WaitTimeSeconds' => 20,
    'MaxNumberOfMessages' => 1
]);

if (isset($result['Messages'])) {
    foreach ($result->getPath('Messages/*/Body') as $messageBody) {
        $handler = new \Myapp\Handler();
        $handler->dispatch($messageBody);
    }
}

這工作正常,但我可以從SQS控制台看到我的腳本檢索的消息被放入“飛行中的消息”類別,然后一段時間后它們被放回“消息可用”,我的腳本結束再次接他們。

如何從SQS隊列中刪除消息,或者更好地將它們標記為已完成?

當您從SQS隊列收到消息時,該消息將(默認情況下)在30秒后返回隊列。 這是為了處理消息處理崩潰並且需要再次處理消息的情況。

成功處理消息后,使用deleteMessage刪除消息。 當您從receiveMessage收到消息時,您需要來自消息的receiptHandle值才能刪除消息。

如果消息的典型處理可能需要30秒以上,那么您可以配置隊列以增加“返回隊列”時間。 這在SQS隊列配置中稱為“默認可見性超時”。

另請注意,Amazon SQS的工作方式如下:

  1. 與將它們添加到隊列的方式相比,可以無序地接收消息
  2. 消息可能會被接收兩次,因此請允許消息處理器處理這些情況

您需要在處理后刪除消息 - 這將被視為“標記已完成”; 但是,如果下游的某些內容需要對此“已完成”的操作執行操作,那么我將“完成”消息發布到另一個SQS隊列並且然后從傳入隊列中刪除該消息並不罕見。 通過這種方式,現在或將來的另一個過程可以采取在第一個工人完成其工作時需要執行的操作,即以分離的方式將這些過程鏈接在一起。

如果沒有任何下游需要完成,只需刪除它就足夠了。

暫無
暫無

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

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