2013-04-16 15 views
12

Używam delayed_job i delayed_job_active_record do wykonywania zadań back ground w mojej aplikacji rails. Korzystamy z opóźnionej_pracy opartej na kolejce. Do uruchomienia opóźnionego używam następującego polecenia.Zapytanie o aktualizację delayed_job działa nieskończenie

RAILS_ENV=staging script/delayed_job -i=1 --queue=queue_name start 

Problem jest poniżej, że zapytanie jest uruchamiane w nieskończoność.

SQL (0.4ms) UPDATE `delayed_jobs` SET `locked_at` = '2013-04-16 09:27:23', `locked_by` = 'delayed_job.=2 host:ip-10-204-210-77 pid:2168' WHERE `delayed_jobs`.`queue` IN ('queue_name') AND ((run_at <= '2013-04-16 09:27:23' AND (locked_at IS NULL OR locked_at < '2013-04-16 05:27:23') OR locked_by = 'delayed_job.=2 host:ip-10-204-210-77 pid:2168') AND failed_at IS NULL) ORDER BY priority ASC, run_at ASC LIMIT 1 

I liczba delayed_job wynosi zero. Z tego powodu aplikacja jest bardzo powolna, a strony nie ładują się w wielu miejscach.

Czy ktoś może zaproponować rozwiązanie.

Dzięki Pozdrawiam.

+0

Pielęgnacja, aby spróbować opóźnić_zdjęć_aktywną_ record_threaded i czy to pomaga? Bardzo chciałbym usłyszeć twoją opinię =) https://github.com/zxiest/delayed_job_active_record_threaded – Abdo

+1

To samo tutaj.To zwodnicze, ponieważ nie ma żadnych zadań i również próbuje "UPDATE". Po prostu generuje niepotrzebny hałas w dziennikach. –

+0

@Menon udało ci się znaleźć rozwiązanie? – scanales

Odpowiedz

1

To jest zapytanie specjalnie zaprojektowane dla PostgreSQL. Proszę odnieść się do https://github.com/collectiveidea/delayed_job_active_record/blob/master/lib/delayed/backend/active_record.rb#L57, dlaczego tak musi być.

Pomysł opóźnionego zadania polega na okresowym odpytywaniu bazy danych, więc zapytanie w twoim pytaniu powinno być uruchamiane tak długo, jak długo działa pracownik. Powinno to się zdarzyć w każdej sekundzie i nie mogę sobie wyobrazić, że ma to znaczący wpływ na wydajność Twojej aplikacji.

Czy używasz bardzo ograniczonego sprzętu, takiego jak bardzo mała maszyna wirtualna?

+0

Nie maszyna wirtualna. mała instancja w Amazon. I używam Mysql not postgres. – apr

+0

Rozumiem, może jest wolny, ponieważ jest zamiany na dysk? Czy sprawdziłeś ślad pamięci procesów ruby? – moritz

4

myślę, co oznaczało, że delayed_jobankiety zbyt często (który nawiasem mówiąc jest co 5 sekund domyślnie) - wiem, że wypełnia swój dziennik, a wydaje „nieskończony” .. :)

Jeśli o to ci chodziło, proponuję uruchomić workless gem. Rozpocznie się tylko delayed_job w zależności od potrzeb. Wiele osób używa go, aby nie uruchamiać swoich dynamicznych robotów, ale działa równie dobrze w trybie development.

Należy pamiętać, że jeśli używasz , musisz również dodać gem 'daemons' do swojego Gemfile (daemons). Zobacz Running Jobs section of delayed_job.

Zatem Twój Gemfile będzie zawierać:

gem 'delayed_job_active_record' 
gem 'daemons' 
gem 'workless' 

Jeśli potrzebujesz więcej wskazówek, daj mi znać w komentarzach poniżej.

2

musiałem użyć silence metody AR, tuż zmienić w pliku [path/to/delayed_job_active_record/gem]/delayed_job_active_record-[any.latest.version]/lib/delayed/backend/active_record.rb wokół linii 68:

count = ready_scope.limit(1).update_all(:locked_at => now, :locked_by => worker.name) 

do

count = silence {ready_scope.limit(1).update_all(:locked_at => now, :locked_by => worker.name)} 

brudny roztwór, wiem, ale działa ... mile widziane zaproponuj lepsze opakowanie, ale dla mnie metoda jest wystarczająco duża, aby zabić wszelkie myśli, aby ją zastąpić config/initializers

Powiązane problemy