AWS SQS Dead Letter Queue - только в определенных случаях - PullRequest
0 голосов
/ 24 октября 2018

Мой вопрос не очень простой, но я верю, что с вашей помощью я найду решение моей проблемы.У меня есть микросервис, который читает сообщения из очереди AWS SQS и сохраняет их в Redis.

В AWS у меня есть две очереди:

  1. AQueue (стандартная очередь)
  2. DeadLetterQueue

Я бы хотел:

  • Удалить сообщения из моей стандартной очереди (AQueue) и переместить их в DeadLetterQueue, например, при 5-кратном разборе ошибок
  • Когда, например, мой Redis временно недоступен, я не хочу удалять прочитанные в данный момент сообщения.В этом случае эти сообщения следует читать снова и снова, пока Redis не заработает.

КАК я могу это сделать?В AWS я установил свою стандартную очередь (AQueue) для отправки сообщений в DeadLetterQueue, когда сообщения не будут работать 5 раз

Мой слушатель:

@SqsListener(value = "${amazon.sqs.destination}", deletionPolicy = SqsMessageDeletionPolicy.NEVER)
    public void receive(String requestJSON, Acknowledgment acknowledgment) {
        try (Jedis jedis = jedisPool.getResource()) {
            if (redisPassword != null && !redisPassword.isEmpty()) {
                jedis.auth(redisPassword);
            }
            long key = jedis.incr("Trace:");
            Trace trace = Trace.fromJSON(requestJSON);
            trace.setTechnicalId(Long.toString(key));
            traceRepository.save(trace);
            acknowledgment.acknowledge();
        }catch (IOException e) {
            log.error("Parse error: " + e.getMessage());
            queueMessagingTemplate.convertAndSend(deadLetterQueue, requestJSON);
            acknowledgment.acknowledge();
        } catch(Exception e){
            log.error("Problem with NOSQL database Redis: " + e.getMessage());
        }

К сожалению, ДАЖЕ, КОГДА я не звонюacknowledgment.acknowledge(); мое сообщение после 5 попыток перемещается в DeadLetterQueue.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Логика должна быть:

  • Если Redis не работает, не извлекать сообщения из SQS (это будет держать их в очереди)
  • Еслисообщение успешно обработано, удалите сообщение , используя предоставленный MessageHandle
  • Настройте очередь для перемещения сообщений в очередь недоставленных сообщений после 5 попыток обработки
0 голосов
/ 24 октября 2018

Звучит так, как будто вы изменили логику - НЕ взломать сообщение будет означать, что оно будет обработано как сбой (и будет повторено, и в конечном итоге будет перемещено в очередь недоставленных писем).ACK сообщение, если вы хотите пометить его как использованное, не ACK, если вы хотите, чтобы оно повторило попытку / DLQ.

(Примечание. Я не знаком с инструментами пружины, которые здесь используются, но я 'м при условии простого сопоставления с основными понятиями SQS)

...