我在AWS SQS队列中有大量消息。这些消息将被其他来源不断推送给它。这些消息被推送到队列的频率没有适当的动态。目前,我每秒都会轮询SQS并检查其中是否有可用的消息。有没有更好的方法来处理这个问题,例如从SQS或SNS收到某些消息可用的通知,以便我只在需要时请求SQS而不是持续轮询?
答案 0 :(得分:6)
执行所需操作的方法是使用长轮询 - 而不是每秒不断轮询,打开一个保持打开的请求,直到它超时或消息进入队列。请查看ReceiveMessageRequest
ReceiveMessageRequest req = new ReceiveMessageRequest()
.withWaitTimeSeconds(Integer.valueOf(20)); // set long poll timeout to 20 sec
// set other properties on the request as well
ReceiveMessageResult result = amazonSQS.receiveMessage(req);
这种常见的使用模式是让后台线程运行长轮询并将结果推送到内部队列(例如LinkedBlockingQueue
或ExecutorService
)以供工作线程读取。
PS。完成处理结果后,请不要忘记致电deleteMessage
,以免最终再次收到。
答案 1 :(得分:1)
您还可以使用AWS Elastic Beanstalk中的工作人员功能。它允许您构建工作程序来处理每条消息,当您使用Elastic Beanstalk将其部署到EC2实例时,您可以将其定义为订阅特定队列。然后每条消息都将POST给工作人员,而不需要从队列中调用receive-message。
它使您的系统布线更容易,因为您还可以使用自动缩放规则,允许您在峰值负载时生成多个工作程序以处理更多消息,并在负载为时缩小回单个工作程序低。如果您从工作人员那里回复,则它也会自动删除该消息。
在此处查看有关它的更多信息:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features-managing-env-tiers.html
答案 2 :(得分:1)
delay: 25 # The delay in seconds to pause a queue when it's empty
但说实话,我们在这里使用delay: 0
,the cost of SQS价格便宜:
您可能会在一台主机上每秒24x7每月花费不到10美元的月度轮询消息。
Shoryuken的一个优点是它可以批量提取,因此与每个消息解决方案的提取相比,它可以节省一些资金。