2012-11-28 5 views
5

Jestem niejasny co do tego, gdzie powinienem mieć skrypt odpytujący o Aws Sqs wewnątrz aplikacji Rails.Czy powinienem mieć dyka pracowniczą heroku do sondowania AWS SQS?

Jeśli używam nici wewnątrz aplikacji internetowych prawdopodobnie użyje cykli procesora, aby słuchać tej kolejki na zawsze, a następnie wpływających wydajność.

I jeśli zarezerwować jeden pracownik Heroku hamowni kosztuje 34,50 $ miesięcznie. Czy warto zapłacić za to cenę za jedną ankietę kolejki? Lub nie jest tak, aby użyć do tego pracownika?

Kod skryptu:

Co robi: Posłuchaj przekonwertowanych plików PDF. Pobiera responde i tworzy obiekt w bazie danych 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 

Potrzebuję pomocy !! Dzięki

+0

Przypuszczam moja odpowiedź będzie zależeć od tego, co robisz z kolejki. Jak ważne jest dla Ciebie, aby wiadomości były przetwarzane w odpowiednim czasie? Jakie przetwarzanie wykonujesz po otrzymaniu wiadomości? – willglynn

+0

Mam zaktualizowane pytanie – Luccas

Odpowiedz

4

Masz trzy podstawowe opcje:

  1. działają w tle jako część hamowni pracowników. Jest to najłatwiejsza i najprostsza opcja, ponieważ jest najbardziej odpowiednia. Twoje procesy sieciowe obsługują przychodzące żądania HTTP, a twój proces roboczy obsługuje komunikaty SQS. Gotowe.
  2. działają w tle jako część hamowni internetowej. Może to oznaczać przestawienie się na inny wątek (i radzenie sobie z problemami, które mogą powodować w Railsach), lub może to oznaczać, że subproces ma przetwarzać w tle. Cokolwiek się stanie, należy pamiętać, limit 512 MB pamięci RAM zużywanej przez hamowni, a ponieważ jestem zakładając, że masz tylko jedno dyno internetowej, należy pamiętać, że dyno idling oznacza, że ​​aplikacja może nie pracuje w trybie 24x7. Ponadto ta opcja źle pachnie, ponieważ jest ogólnie sprzeczna z duchem 12-factor app.
  3. Do pracy jako tło procesów jednorazowych. Zrób np. zadanie, które przetwarza kolejkę i kończy pracę, gdy jest puste. Heroku Scheduler jest idealny: uruchamiać go raz na 20 minut lub coś w tym stylu. Zapłacisz za jednorazową dyno tak długo, jak działa, ale ponieważ jest to tylko kilka sekund, jeśli kolejka jest pusta, kosztuje mniej niż zawsze pracujący robotnik. Alternatywnie, Twoja aplikacja internetowa może korzystać z interfejsu API Heroku do uruchamiania jednorazowego procesu, programowo uruchamiającego odpowiednik heroku run rake handle_sqs.
+0

Dobra odpowiedź! Pierwsza opcja wydaje się właściwa, ale dla mnie jest to trochę kosztowne. Trzecia opcja, którą wypróbowałem raz bez Scheduler, ale jednorazowy proces pozostaje żywy przez 1 minutę i zniknął. – Luccas

+0

Jeszcze raz dziękuję za odpowiedź. Jedna ostatnia wątpliwość: czy zastanawiam się, czy słuchać wielu kolejek, czy mogę umieścić go w jednym miejscu pracy, prawda? – Luccas

+0

Pewnie. 'ReceiveMessage' może odbierać tylko z jednej kolejki, ale jeśli jesteś jednowątkowy i wybrałeś strategię" opróżnij-kolejka-i-wyjdź ", nic nie powstrzyma cię od sekwencyjnego przetwarzania wielu kolejek. – willglynn