首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只在某些情况下使用AWS SQS死信队列

只在某些情况下使用AWS SQS死信队列
EN

Stack Overflow用户
提问于 2018-10-24 11:26:28
回答 2查看 1.4K关注 0票数 0

我的问题不是很容易,但我相信我会在你的帮助下找到解决我的问题的办法。我有一个微服务,可以读取AWS队列中的消息,并将其保存在Redis中。

在AWS上,我有两个队列:

  1. AQueue (标准队列)
  2. DeadLetterQueue

我想:

  • 从标准队列(AQueue)中删除消息,当出现5次错误解析时,将它们移动到DeadLetterQueue
  • 例如,当我的Redis暂时不可用时,我想不删除当前读取的消息。在这种情况下,这些消息应该被一遍又一遍地读取,直到Redis能够工作。

我该怎么做?在AWS上,我已经将标准队列(AQueue)设置为在消息将失败5次时向DeadLetterQueue发送消息。

我的听众:

代码语言:javascript
复制
@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。

EN

回答 2

Stack Overflow用户

发布于 2018-10-24 17:21:32

听起来你的逻辑被颠倒了--不加标记意味着它将被视为失败(并重新尝试,并最终移到死信队列中)。当您想要将消息标记为已消耗的消息时,不要对其进行ACK,如果您希望它重试/DLQ。

(注意-我不熟悉这里涉及的spring工具,但我假设直接映射到核心SQS概念)

票数 0
EN

Stack Overflow用户

发布于 2018-10-24 22:16:29

逻辑应该是:

  • 如果Redis关闭,将不会从SQS中提取消息(这将使它们保持在队列中)
  • 如果消息已成功处理,将使用提供的MessageHandle删除消息MessageHandle
  • 在尝试5次处理后,将队列配置为将消息移动到死信队列
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52967781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档