2012-12-04 108 views
0

我想知道是否有通知sqs隊列結束的最佳做法。我產生了一羣通用工作者來從隊列中消費數據,並且我想通知他們,一旦他們在隊列中檢測不到更多消息,他們就可以停止處理。 sqs是否提供這種類型的功能?Amazon SQS隊列檢測結束

+0

您是否試過閱讀文檔?如果是這樣,你覺得不清楚呢? – willglynn

回答

0

通過查看SQS的right_aws ruby​​ gem源代碼,我發現在隊列中存在ApproximateNumberOfMessages屬性。您可以使用標準的API調用請求。

你可以找到更多信息,包括的例子在這裏:

http://docs.amazonwebservices.com/AWSSimpleQueueService/latest/APIReference/Query_QueryGetQueueAttributes.html

有關如何做到這一點使用Ruby中right_aws寶石看起來更加信息請訪問:

0

你的意思是「生產者是否有辦法通知消費者它已完成發送消息?」 。如果是這樣,那麼沒有。如果消費者調用「ReceiveMessage」並且不收回任何東西,或者「ApproximateNumberOfMessages」返回零,那麼這不能保證不會發送更多消息,或者甚至沒有消息在飛行中。而製作人不能發送任何類型的「流尾」消息,因爲只有一個消費者會收到該消息,並且可能無序到達。即使您使用單獨的通知機制(例如SNS主題)通知所有消費者,也無法保證在所有消息發送之前SNS通知都不會到達。

但是,如果您只希望在隊列中沒有留言時退出工作人員池,請考慮將隊列中的「ReceiveMessageWaitTimeSeconds」屬性設置爲最大值20秒。當沒有更多的消息要處理時,ReceiveMessage呼叫將阻塞高達20秒,以查看消息是否到達,而不是立即返回。

如果你擔心釋放資源,你可以管理你的線程池查詢ApproximateNumberOfMessages來管理你的線程池。如果這樣做,那麼請注意,您返回的數字是「近似值」,並且您應該始終假定即使ApproximateNumberOfMessages返回零,隊列中可能仍有一條或多條消息。