Resque Redis losowe nie wysyłanie maili

Może ktoś spotkał się z takim problemem: Railsowa appka, mailer obsługiwany przez rescque i redisa- niektore maile nie są wysyłane, losowo- nie ma błędu w resque, w logach servera również nie ma błędu- jedyne co widzę to brak renderowania treści maila w logach- i to faktycznie się powtarza w tych nie wysłanych mailach, ale nie leci żaden bład po stronie Ruby, może macie pomysł co to może być? może ktoś się spotkał z czymś podobnym :wink: Dzieki!

Znalazłam winowajcę…,odpowiem tu może komuś się przyda :stuck_out_tongue: Do wysyłania maili z appki railsów był też używany GEM rails-observer, i tam podczas wywołania metody “after_create” miała się wysyłać notoyfikacja, ale niestety czasami rekord w bazie nie zdążył się zapisać -> a mail już chciał się wysyłać z tymże potrzebował zapisanego rekordu z bazy którego jeszcze nie było -> mail nie mial danych, nie wysłał się. (tzw race condition). Prawdopodobnie rozwiązaniem jest stosowanie metody after_commit z opcją create. (ale jak widzę gem rails observer nie ma tej opcji :().

2 Likes

Super, że dzielisz się swoim spostrzeżeniem (wiele osób napisałoby tylko “problem nieaktualny”)! Co do opcji opcji on :create może ten link pomoże https://stackoverflow.com/questions/7238699/rails-3-how-to-identify-after-commit-action-in-observers-create-update-destro. Można też kombinować z zakolejkowaniem zadania z pewnym opóźnieniem (potrzebny resque-scheduler), albo w przypadku gdy zadanie w tle nie znajduje rekordu ponawiać go za jakiś czas.

Możesz spróbować rozwiązać to jeszcze inaczej - jeśli chcesz, żeby zadanie Resque było niezależne od aplikacji, o ile to możliwe możesz przekazać wszystkie niezbędne parametry do zadania i nie odczytywać niczego z bazy.

1 Like

Dzięki za podpowiedzi :slight_smile:
Wygląda na to, że taka konstrukcja sprawidzi się w opisanym przypadku:

w observer:
def after_commit(record)
if (record.send(:transaction_include_any_action?, [:create]))

end
end

Jeżeli record to obiekt ActiveRecord to radziłbym nie. Lepiej operować na wartościach niż obiektach (nie ma problemów z serializacją itp).