【发布时间】:2014-10-16 02:22:08
【问题描述】:
我在 AWS SQS 队列中有大量消息。这些消息将被其他来源不断推送给它。这些消息被推送到队列的频率没有适当的动态。目前,我每秒都在轮询 SQS 并检查那里是否有可用的消息。有没有更好的方法来处理这个问题,比如从 SQS 或 SNS 接收一些消息可用的通知,以便我只在需要时才请求 SQS 而不是不断轮询?
【问题讨论】:
标签: amazon-web-services amazon-sqs
我在 AWS SQS 队列中有大量消息。这些消息将被其他来源不断推送给它。这些消息被推送到队列的频率没有适当的动态。目前,我每秒都在轮询 SQS 并检查那里是否有可用的消息。有没有更好的方法来处理这个问题,比如从 SQS 或 SNS 接收一些消息可用的通知,以便我只在需要时才请求 SQS 而不是不断轮询?
【问题讨论】:
标签: amazon-web-services amazon-sqs
做你想做的事情的方法是使用长轮询 - 不是每秒不断地轮询,而是打开一个保持打开状态的请求,直到它超时或消息进入队列。查看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),以供工作线程读取。
附言。处理完结果后不要忘记致电deleteMessage,这样您就不会再次收到它。
【讨论】:
您还可以使用 AWS Elastic Beanstalk 中的工作线程功能。它允许您构建一个工作线程来处理每条消息,当您使用 Elastic Beanstalk 将其部署到 EC2 实例时,您可以将其定义为订阅特定队列。然后每条消息都将 POST 到工作人员,而无需从队列中调用接收消息。
它使您的系统布线更加容易,因为您还可以拥有自动缩放规则,允许您生成多个工作人员以在峰值负载时处理更多消息,并在负载下降时缩减为单个工作人员低的。如果您的工作人员回复 OK,它也会自动删除该消息。
在此处查看更多信息:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features-managing-env-tiers.html
【讨论】:
delay: 25 # The delay in seconds to pause a queue when it's empty
但老实说,我们在这里使用delay: 0,the cost of SQS 很便宜:
您可能会花费不到 10 美元每月在单个主机上进行 24x7 的轮询消息。
Shoryuken 的优点之一是它可以批量提取,因此与按消息提取解决方案相比,它可以节省一些钱。
【讨论】: