Удаление сообщений из очереди SQS после обработки

Мое приложение отправляет сообщения в очередь 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 или, что еще лучше, пометить их как завершенные?

5

Решение

Когда вы получите сообщение из очереди SQS, оно (по умолчанию) вернется в очередь через 30 секунд. Это необходимо для обработки случаев, когда обработка сообщения завершается сбоем и сообщение необходимо обработать снова.

Как только ваше сообщение успешно обработано, используйте deleteMessage удалить сообщение. Вам понадобится receiptHandle значение из сообщения, когда вы получили его от receiveMessage для того, чтобы удалить сообщение.

Если обычная обработка вашего сообщения может занять более 30 секунд, то вы можете настроить свою очередь, чтобы увеличить это время «возврата в очередь». Это называется «Тайм-аут видимости по умолчанию» в конфигурации очереди SQS.

Также имейте в виду, что Amazon SQS работает таким образом, что:

  1. сообщения могут быть получены не по порядку по сравнению с тем, как они были добавлены в очередь
  2. сообщения могут быть получены дважды, поэтому разрешите обработчику сообщений обрабатывать эти случаи
10

Другие решения

Вам необходимо удалить сообщения после их обработки — это будет считаться «пометкой их завершенных»; однако, если что-то в нисходящем направлении должно действовать для этого «завершенного» действия, я нередко отправляю сообщение «завершения» в другую очередь SQS, а затем удаляю сообщение из входящей очереди. Таким образом, другой процесс, либо сейчас, либо в будущем, может предпринять действия, которые необходимо выполнить, когда первый работник завершит свою работу, то есть объединить эти процессы в развязанном виде.

Если в нисходящем направлении ничего не нужно делать, достаточно просто удалить его.

2