2009-03-18 14 views
6

Mam aplikację, która sprawdza bazę danych co minutę dla wszystkich wiadomości e-mail, które mają zostać wysłane w tym czasie. Myślałem o zrobieniu tego zadania rake, które będzie uruchamiane co minutę przez crona. Czy byłoby lepsze rozwiązanie tego problemu?Najlepsze rozwiązanie dla poczty, która działa co minutę.

Z tego, co przeczytałem, nie jest to idealne, ponieważ prowizja musi ładować całe środowisko szyn co minutę, a to staje się drogie.

Myśli?

Dzięki.

Odpowiedz

11
  1. Możesz użyć backgroundrb. To jednak pochłonie pamięć z głównej aplikacji Railsowej, ponieważ spowoduje utworzenie jednej instancji Ruby wyłącznie dla backgroundrb.
  2. Możesz również zdefiniować SystemController (lub odpowiednik) w głównej aplikacji, z różnymi akcjami odpowiadającymi różnym zadaniom domowym, które powinna wykonać aplikacja. Możesz "prod" go z crontab przy użyciu wget lub curl, zaletą jest to, że dzieli zasoby z główną aplikacją. W zależności od tego, jak paranoi lub jesteś, lub w jaki sposób wrażliwe na DOS (lub inne typy ataków) narażasz takiego kontrolera na, być może, świat zewnętrzny, możesz zablokować dostęp do adresu URL tego kontrolera z adresów innych niż pętla zwrotna (idealnie w odwrotnym proxy, alternatywnie od samego kontrolera.)
0

Robię to, co Vlad zasugerował (# 2), z zastrzeżeniem tylko lokalnych żądań, i jestem wystarczająco paranoikiem, aby wymagać również określonego łańcucha zapytań do adresu URL.

Mam kilka okresowych czynności ustawionych w ten sposób.

1

One naprawdę prosty sposób byłoby mieć skrypt, który robi ..

while true do 
    check_and_send_messages() 
    sleep 60 
end 

..which oznacza, że ​​nie są stale respawning środowiska Rails.

Oczywiście ma różne wady, ale ma również pewne korzyści (na przykład z telefonem 1-Rake na minutę, to zadanie Rake trwa dłużej niż jedną minutę, Rake zostanie uruchomiony kilka razy na raz)

również Railscasts epizodów Rake in Background, Starling and Workling i Custom Daemon może dać Ci kilka pomysłów (są one opisując dokładnie tego zadania)

1

Okazuje się, że rzeczywiście coś zbudowany właśnie na tym: ar_mailer. ar_mailer umieszcza w kolejce wiadomości e-mail w bazie danych, a następnie wysyła je okresowo za pomocą komendy ar_mailer. Możesz zadzwonić do ar_mailera co minutę.

Zaletą ar_mailer jest to, że zasadniczo wymaga niewielkiej zmiany w zakresie sposobu wysyłania wiadomości e-mail. Musisz tylko odziedziczyć po ar_mailer zamiast ActiveMailer. Dzięki tej metodzie nie musisz się martwić o uruchamianie zadań rake'owych w tle, rozwidlanie procesów, czy cokolwiek w tym rodzaju - iw efekcie dostajesz prawdziwy serwer poczty z kolejnymi wiadomościami, które są usuwane, gdy poczta jest faktycznie wysyłana. Ta funkcja jest ważna, jeśli masz system, który wysyła dużą liczbę enmass e-mail. Użyłem ar_mailera do zbudowania sieci społecznościowej - więc mogę poświadczyć jej solidność.

Here's a good article that talks about ar_mailer in depth. Zdecydowanie odradzam wdrażanie własnego rozwiązania, ponieważ Eric zbudował sprawdzone rozwiązanie tego problemu.

Powiązane problemy