我想知道是否有通知结束sqs队列的最佳做法。我正在产生一堆通用工作程序来使用队列中的数据,我想通知他们一旦检测到队列中没有更多消息就可以停止处理。 sqs是否提供此类功能?
答案 0 :(得分:0)
通过查看SQS的right_aws ruby gem源代码,我发现队列中有ApproximateNumberOfMessages属性。您可以使用标准API调用请求。
您可以在此处找到更多信息,包括示例:
有关如何使用ruby中的right_aws gem执行此操作的更多信息,请查看:
答案 1 :(得分:0)
您的意思是“生产者是否有办法通知消费者它已完成发送消息?” 。如果是这样,那么没有。如果消费者调用“ReceiveMessage”并且什么都没有回来,或者“ApproximateNumberOfMessages”返回零,那么这并不能保证不再发送消息,甚至没有消息在飞行中。并且生产者不能发送任何类型的“流结束”消息,因为只有一个消费者会收到它,并且它可能无法到达。即使您使用单独的通知机制(如SNS主题)来通知所有消费者,也无法保证在发送所有消息之前SNS通知不会到达。
但是,如果您只希望在队列中没有消息时退出工作池,请考虑将队列中的“ReceiveMessageWaitTimeSeconds”属性设置为最大值20秒。当没有更多要处理的消息时,ReceiveMessage调用将阻塞最多20秒,以查看消息是否到达而不是立即返回。
如果您担心释放资源,您可以拥有管理线程池查询的所有内容AboutimateNumberOfMessages来定期扩展/缩小您的线程池。如果你这样做,那么请注意你得到的数字是近似的,你应该总是假设队列中可能还有一条或多条消息,即使ApproximateNumberOfMessages返回零。