2012-11-28 11 views
5

我在哪裏應該有一個腳本輪詢一個Rails應用程序中的Aws Sq的混淆。我是否應該有一個heroku工作人員動態調查AWS SQS?

如果我在web應用程序中使用線程,可能會使用cpu週期來永久地偵聽此隊列,然後影響性能。

如果我保留一個單一的英雄工人動態,它每個月花費34.50美元。爲單一隊列調查支付這個價格是否合理?或者使用工作人員並非如此?

腳本代碼:

它能做什麼:聽轉換的PDF文件。獲取responde並將該對象創建到postgres數據庫中。

queue = AWS::SQS::Queue.new(SQSADDR['my_queue'])  
    queue.poll do |msg| 
    ... 
    id = received_message['document_id'] 
    @document = Document.find(id) 
    @document.converted_at = Time.now 
    ... 
    end 

我需要幫助!由於

+0

我想我的答案將取決於你在隊列中做什麼。它對你的信息得到及時處理有多重要?您收到訊息後會執行哪些處理? – willglynn

+0

我已更新問題 – Luccas

回答

4

你有三個基本的選擇:

  1. 做後臺工作的工人賽道的一部分。這是最簡單,最直接的選擇,因爲它是最合適的。您的Web進程處理傳入的HTTP請求,並且您的工作進程處理SQS消息。完成。
  2. 做後臺工作的一部分,您的網絡動態。這可能意味着轉動另一個線程(並處理可能在Rails中引起的問題),或者這可能意味着要執行後臺處理的子進程。無論發生什麼事,請牢記測功機消耗的512 MB內存限制,並且由於我假設您只有一個網絡測試儀,請注意,dyno idling意味着您的應用可能不是全天候運行。此外,這個選項味道不好,因爲它通常違背12-factor app的精神。
  3. 做後臺工作作爲一次性過程。例如,一個rake handle_sqs任務處理隊列並在其爲空時退出。 Heroku Scheduler是理想的:它每20分鐘運行一次或什麼。只要它運行,你就會支付一次性測力儀的費用,但是由於如果隊列是空的,這只是幾秒鐘,所以與永遠在線的工作人員相比,費用更低。或者,您的網絡應用程序可以使用Heroku API啓動一次性過程,以編程方式運行等效的heroku run rake handle_sqs
+0

好的答案!第一種選擇似乎是正確的,但對我來說是一個有點昂貴的支付。第三個選項我曾經嘗試過一次沒有Scheduler,但是一次性過程保持1分鐘,然後消失。 – Luccas

+0

再次,謝謝你的答案。最後一個疑問:如果我想聽多個隊列,我可以把它放在一個單獨的工作人員的權利? – Luccas

+0

當然。 'ReceiveMessage'當然只能從一個隊列中接收,但如果你是單線程的並且選擇了排隊和退出策略,沒有任何東西可以阻止你順序處理多個隊列。 – willglynn

相關問題