我有以下用例:
我有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完成吗?或者有人有更好的解决方案来解决这个问题吗?
感谢。
答案 0 :(得分:2)
退一步看来,您的要求是:
一种选择是利用 DynamoDB Streams 和 AWS Lambda :
这就是全部!不需要队列,cron作业,也不需要等到晚上处理一批消息。如果没有生成消息,则不收取任何费用。如果由于DynamoDB中的更新而生成了大量消息,则Lambda将自动扩展以针对每次更新运行函数。 (但请注意,如果一个值在短时间内快速更新,则无法保证Lambda将以相同的顺序运行。)
答案 1 :(得分:0)
是的,您提到的方法可以实施。
我有一个简单的替代方案。 1.创建一个crontab(以及它是Linux系统)或计划任务(对于Windows系统),以便在每天结束时执行一个非常小的程序,比如在时间戳23:59:59。
String SNSqueue = SNSqueue_URL sqs.sendMessage(new SendMessageRequest(SNSqueue," newday"));
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)当您开始处理时,自己在队列中插入“标记”消息。当您看到标记时,请停止处理。从队列中提取消息的每个工作人员都需要执行此操作(即如果您有多个工作人员,则需要多个标记)。