2013-07-23 8 views
5

Używałem pomyślnie Sidekiq do uruchamiania zadań w tle, które są inicjowane przez akcje użytkownika w aplikacji Rails 3.2. Moja szczególna aplikacja polega na wysyłaniu i odbiorze danych zi zewnętrznego źródła za pośrednictwem zewnętrznego API.Jak mogę uruchomić ciągłe zadanie w tle za pomocą Sidekiq?

Muszę zachować synchronizację danych z tym zewnętrznym źródłem, stale sprawdzając każdego użytkownika, czy są dostępne dane do pobrania.

Wszystkie moje dotychczasowe zadania zostały zainicjowane przez użytkownika, jak wspomniałem powyżej. Moje pytanie brzmi, czy chcę ciągle sprawdzić istnienie danych zewnętrznych dla każdego użytkownika, w while pętli sobie wyobrazić:

# pseudocode 
while true 

    for user in User.active 
    data = user.get_data 
    next if data.blank? 

    UserDataWorker.perform_async(user.id) 

    end 
end 

to gdzie mogę umieścić powyższy kod? Nie rozumiem, w jaki sposób odradzać się ciągłe zadanie. Nie chcę umieszczać kodu w module Sidekiq, ponieważ będzie to praca, która nigdy się nie zakończy. Czy powinienem to zrobić?

Nie chcę umieszczać go w zadaniu rake, bo jak mam monitorować to zadanie? Wszystko, co czytałem o Sidekiq, wydaje się wskazywać na pracownika wykonującego zadanie, które jest skończone i może zostać ukończone lub usunięte. Doceniam każdą pomoc, którą możesz zaoferować.

+0

Co powiesz na wykorzystanie zadania cron? – mkk

+0

Myślałem o tym, ale cron jest bardziej zorientowany na zadania, a to, czego szukam, przypomina bardziej demona. – AKWF

Odpowiedz

3

Wielowątkowość Ruby jest właśnie do tego. Nawiązać wątek w folderze inicjalizacyjnym:

Thread.new do 

    while true 

    for user in User.active 
     data = user.get_data 
     next if data.blank? 

     UserDataWorker.perform_async(user.id) 
    end 
    sleep 1 

    end 
end 

Jeśli kontrole nie wymagają dużych zasobów, powinny być prawidłowe.