Подтвердить что ты не робот

Как заставить ActiveJob запускать задания в Sidekiq на Heroku при вызове из приложения (а не в консоли)?

Я запускаю Rails 4.2 на Heroku (кедр), Ruby 2.1.6

У меня есть Sidekiq, работающий локально на Redis с Foreman, и в моем приложении я вызываю новые методы ActiveLive ActiveLob для Rails, подобные этому, внутри application_helper.rb:

assigning_user = User.find(object.created_by)
completing_user = User.find(object.completed_by)
if NotificationMailer.assigned_user_completed_todo(object, completing_user, assigning_user).deliver_later
  nn.email_status = "sent"
end

Локально это работает так, как предполагалось. Почтовые сообщения отображаются в очереди "почтовых отправлений", а затем обрабатываются и передаются с помощью sendgrid.

Вкл heroku run rails console Я могу запустить его вручную, и он отлично работает:

Loading production environment (Rails 4.2.1)
irb(main):001:0> a = Account.first
Account Load (1.5ms)  SELECT  "accounts".* FROM "accounts"  ORDER BY     "accounts"."id" ASC LIMIT 1
=> #<Account id: 1, name: "The Prestons", stripe_customer_id: nil, active_until: "2015-06-27 14:50:43", plan: nil, created_at: "2015-04-27 14:50:43", updated_at: "2015-04-27 14:50:43">
irb(main):002:0> NotificationMailer.new_account_created(a).deliver_later
Enqueued ActionMailer::DeliveryJob (Job ID: 7c0ddf9c-6892-4aa9-823e-9954b2a4e642) to Sidekiq(mailers) with arguments: "NotificationMailer", "new_account_created", "deliver_now", gid://raisin/Account/1
=> #<ActionMailer::DeliveryJob:0x007f4d9ed9da58 @arguments=["NotificationMailer", "new_account_created", "deliver_now", #<Account id: 1, name: "The Prestons", stripe_customer_id: nil, active_until: "2015-06-27 14:50:43", plan: nil, created_at: "2015-04-27 14:50:43", updated_at: "2015-04-27 14:50:43">], @job_id="7c0ddf9c-6892-4aa9-823e-9954b2a4e642", @queue_name="mailers">

но если я просто завершу действия в своем приложении, то, как я буду в качестве пользователя, ничто не будет доставлено в очередь... Я полностью из идей. Я выполняю рабочий процесс. Я подключен к серверу redis cloud. Я вижу панель инструментов sidekiq.

Что я не настраиваю? С удовольствием предоставляем другие журналы/информацию, но не уверен, что еще нужно предоставить.

Моя консоль просто сообщает о действии:

2015-05-14T09:14:37.674095+00:00 heroku[router]: at=info method=POST path="/accounts/1/projects/15/lists/33/items/112" host=www.myapp.com request_id=516db810-8a2c-4fd0-af89-29a59783b0a8 fwd="76.104.193.78" dyno=web.1 connect=1ms service=111ms status=200 bytes=2039
4b9b3361

Ответ 1

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

Вздох.

Но для потомков и для тех, кто пытается заставить Sidekiq работать на Heroku с Rails 4.2 и Redis Cloud, вот некоторые подводные камни, с которыми я столкнулся: часть, которая заняла у меня больше всего времени, чтобы понять, что для того, чтобы получить sidekiq, чтобы найти ваш сервер Redis, вам нужно установить переменную ENV IN HEROKU (не в вашем коде). Итак, на консоли сначала добавьте, например, rediscloud:

heroku addons:create rediscloud

И тогда вам нужно добавить URL как переменную среды:

heroku config:set REDIS_PROVIDER=REDISCLOUD_URL

Документация sidekiq очень полезна. Я использовал brew install redis для установки redis локально, затем redis-server для локального запуска сервера в окне терминала. Добавлен gem 'sidekiq' в gemfile и все отлично работает в разработке.

Если вы добавите маршруты как показано здесь, вы сможете отслеживать очередь в своем веб-браузере.

И, наконец, не забывайте, что вам нужно добавить работника в ваш Procfile И масштаб до одного работника в герою с помощью heroku ps:scale worker=1 - он не начнет просто вызвать его в вашем файле Procfile.

Также: когда вы помещаете sidekiq в свой файл Procfile, обязательно скажите ему, чтобы обрабатывать очередь почтовых ящиков, например:

worker: bundle exec sidekiq -q default -q mailers