2016-08-01 10 views
1

Я работаю над приложением Rails, которое отправляет письма в фоновом режиме с помощью Sidekiq и Mandrill. В моем приложении у меня есть две очереди, одна для взаимодействия с моей службой (нерелевантная), а вторая - очередь почтовых сообщений. Очередь почтовой рассылки используется двумя почтовыми программами: один для управления профилем пользователя, а другой - для взаимодействия с нашим сервисом (не имеет значения).Задание Sidekiq запланировано, не работает и просто исчезает

Сегодня я заметил, что пользователи не получают электронные письма в течение нескольких дней, кроме письма с подтверждением, которое отправляется Devise.

Другая очередь работает безупречно и не имеет проблем. (Поэтому, возможно, конфигурация Sidekiq не проблема).

Например позволяет принимать UserMailer, который уведомляет пользователя об успешном обновлении профиля:

user_mailer.rb

def update_user(user) 
    @user = user 
    mail(:to => user.email) 
end 

user_profile_controller.rb

def update_resource(user) 
    user.save 
    UserMailer.update_user(user).deliver_later(wait: 1.minute) 
    end 

Когда я попытался тестирования эта функция с deliver_now вместо deliver_later, она работала, и почта была отправлена ​​(так что соединение с Мандрилл работает). Когда я тестирую эту функцию как есть, задание добавляется в очередь почтовых сообщений. Когда пришло время отправить электронное письмо, оно просто исчезнет из очереди, не отправив электронное письмо и не оставив никаких исключений в журналах.

Я вижу, что он отображается в пользовательском интерфейсе Sidekiq, а затем исчезает.

Я думаю, что письмо с подтверждением отправлено только потому, что оно не задерживается, но я не знаю, почему это происходит.

Все работает отлично в моей промежуточной среде. Разница в том, что он работает с mailtrap и не имеет таких рабочих мест, как производство.

Некоторый код, который может иметь отношение:

production.rb

config.action_mailer.delivery_method = :smtp 
    config.action_mailer.smtp_settings = { 
     :user_name => 'xxx', 
     :password => Rails.application.secrets.smtp_password, 
     :address => 'smtp.mandrillapp.com', 
     :domain => config.app_domain, 
     :port => 'xxx', 
     :authentication => :login 
    } 
... 
config.action_mailer.default_url_options = { :host => config.app_domain, :protocol => 'https' } 
    config.action_mailer.perform_deliveries = true 
    config.action_mailer.raise_delivery_errors = false 

application.rb

config.active_job.queue_adapter = :sidekiq 

Прошлись по этим ссылкам без решения:

http://guides.rubyonrails.org/active_job_basics.html http://api.rubyonrails.org/classes/ActionMailer/Base.html

Не найдено ни одной ссылки, имеющей отношение к моей проблеме.

  • Пробовал передислокацию
  • Пробовал перезапуск Sidekiq
  • Пробовал перезапуск Redis
  • Пробовал перезапуск самого сервера
  • Пробовали отправки электронной почты из консоли - Успешной
  • Пробовали отправки электронной почты с deliver_later (подождите: 1 мин.) - Неудачно
+0

У меня возникла аналогичная проблема сегодня, я не уверен, что это помогает но попробовали ли вы запустить свой сервер с помощью этой команды? 'bundle exec sidekiq -q default -q mailers 'https://github.com/mperham/sidekiq/wiki/Active-Job#action-mailer – sirramongabriel

+0

@sirramongabriel yep – MaxDBN

+0

Вы выяснили источник этой проблемы? У меня очень похожая проблема. –

ответ

0

Я схожу что он имеет какое-то отношение к нехватке памяти на сервере. Когда я увеличил память на сервере и параметр max_connections на postgres, все электронные письма в этой очереди, которые должны были быть отправлены, были немедленно отправлены