按日计划在两个SQS队列之间切换

时间:2016-05-24 15:44:57

标签: amazon-web-services amazon-sqs amazon-sns

我有以下用例:

我有SQS Queue订阅了SNS topic。消息将连续发送到队列。工作是每隔一天处理SQS Queue中的消息。通过这个我的意思是我会让消息整天进入SQS,然后处理直到(比如说)午夜的消息。这应该是日常工作(即我不想无限期地轮询SQS Queue消息)。

问题在于,当我从SQS Queue读取消息时,新消息将不断进入队列。因此,我无法停止阅读消息(我在队列为空时停止)。

我想到的解决方案涉及在队列之间切换,并且如下所示:

  • 我会有两个SQS queues
  • 第一个队列从SNS收集来自day 1的消息。
  • Day 2,我会SQS Queue-2订阅SNS主题并取消订阅Queue-1
  • 会阅读Queue-1的讯息。我可以停下来,因为我不会收到任何新消息。
  • 第二天,我会订阅SQS Queue-1并取消订阅Queue-2

这种方法是否可行?这可以用Java完成吗?或者有人有更好的解决方案来解决这个问题吗?

感谢。

3 个答案:

答案 0 :(得分:2)

退一步看来,您的要求是:

  • 数据(以某种方式)在DynamoDB中更新
  • 对于每次更新,您希望检索更新的数据并进行一些处理。这不一定立即发生 - 每天都可以接受。

一种选择是利用 DynamoDB Streams AWS Lambda

  • 在DynamoDB中更新数据时, DynamoDB Streams 可以生成包含该数据的当前值和先前值的消息。 (对于新项目,它仅包含当前值。对于已删除项目,它仅包含删除前的先前值。)
  • AWS Lambda 可以从DynamoDB Streams检索邮件并对其执行操作。 Lambda函数可以用Java,Python或node.js编写。此函数将查看先前/当前值并执行您需要的任何处理。

这就是全部!不需要队列,cron作业,也不需要等到晚上处理一批消息。如果没有生成消息,则不收取任何费用。如果由于DynamoDB中的更新而生成了大量消息,则Lambda将自动扩展以针对每次更新运行函数。 (但请注意,如果一个值在短时间内快速更新,则无法保证Lambda将以相同的顺序运行。)

答案 1 :(得分:0)

是的,您提到的方法可以实施。

我有一个简单的替代方案。 1.创建一个crontab(以及它是Linux系统)或计划任务(对于Windows系统),以便在每天结束时执行一个非常小的程序,比如在时间戳23:59:59。

  1. 这个所谓的小程序只是向你正在使用的SQS队列(SNS发送消息的队列)发送一条简单的消息,比如说“SNSqueue'”, 此消息只是一个分隔符/标记消息,可以像" newday"一样简单。
  2.   

    String SNSqueue = SNSqueue_URL       sqs.sendMessage(new SendMessageRequest(SNSqueue," newday"));

    1. 当您开始从此SQS队列中提取消息时,请通过'对于'在其中可以应用消息处理逻辑的循环。 当您收到带有正文" newday"
    2. 的消息时,循环会中断
       List<Message> messages = sqs.receiveMessage(receiveMessageRequest).getMessages();
          for (Message message : messages) 
          {
            //message processing logic
            //Delete the processed messages after processing from this queue to make room for new messages or archive them over disk
            if(message.getBody().equals("newday"))
                System.exit(0); //or any relevent termination code
          }
      

      这样你就可以避免每天在队列之间切换。

答案 2 :(得分:-1)

你的解决方案有效,但它比它需要的更复杂。

替代解决方案:

1)查看消息的时间戳。一旦你看到一个“当前”日,你就会停止处理。 SQS将通过SDK

为您提供这些时间戳

2)当您开始处理时,自己在队列中插入“标记”消息。当您看到标记时,请停止处理。从队列中提取消息的每个工作人员都需要执行此操作(即如果您有多个工作人员,则需要多个标记)。