web-dev-qa-db-fra.com

Comment puis-je demander à ActiveJob de mettre en file d'attente des travaux dans Sidekiq sur Heroku lorsqu'il est appelé à partir de l'application (et non de la console)?

Je lance Rails 4.2 sur Heroku (cèdre), Ruby 2.1.6

J'ai Sidekiq qui s'exécute localement sur Redis avec Foreman, et dans mon application, j'appelle les nouvelles méthodes Deliver_later d'ActiveJob comme ceci, à l'intérieur de 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

Localement, cela fonctionne comme prévu. Les e-mails s'affichent dans la file d'attente des "expéditeurs", puis sont traités et envoyés à l'aide de sendgrid.

Sur heroku run Rails console Je peux le déclencher manuellement, et ça marche très bien:

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">

mais si je termine simplement des actions dans mon application, comme je le ferais en tant qu'utilisateur, rien n'est jamais livré à la file d'attente ... Je suis totalement à court d'idées. J'exécute un processus de travail. Je suis connecté au serveur cloud redis. Je peux voir le tableau de bord Web sidekiq.

Qu'est-ce que je ne mets pas? Heureux de fournir d'autres journaux/informations, mais je ne sais pas quoi d'autre à fournir.

Ma console rapporte simplement l'action:

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
23
Jason Preston

Embarrassant , il s'avère que tout fonctionne correctement, et l'action que je faisais pour tester la livraison des e-mails via le code n'aurait jamais envoyé d'e-mail, car l'utilisateur I le testait avec les notifications par e-mail désactivées dans les paramètres.

Soupir.

Mais pour la postérité et pour ceux qui essaient de faire fonctionner Sidekiq sur Heroku avec Rails 4.2 et Redis Cloud, voici quelques pièges que j'ai rencontrés: la partie qui m'a pris le plus de temps pour comprendre était que pour que Sidekiq trouve votre serveur Redis, vous devrez définir la variable ENV IN Heroku (pas dans votre code). Ainsi, sur la console, ajoutez d'abord par exemple rediscloud:

heroku addons:create rediscloud

Et puis vous devez ajouter l'URL en tant que variable d'environnement:

heroku config:set REDIS_PROVIDER=REDISCLOUD_URL

La documentation Sidekiq est super utile. J'ai utilisé brew install redis pour installer Redis localement, puis redis-server pour exécuter le serveur dans une fenêtre de terminal localement. Ajoutée gem 'sidekiq' au Gemfile et tout fonctionnait très bien dans le développement.

Si vous ajoutez des itinéraires comme indiqué ici , vous pourrez surveiller la file d'attente dans votre navigateur Web.

Enfin, n'oubliez pas que vous devez ajouter un travailleur dans votre Procfile ET passer à un travailleur dans Heroku en utilisant heroku ps:scale worker=1 - il ne démarrera pas simplement parce qu'il est dans votre Procfile.

Aussi: lorsque vous mettez Sidekiq dans votre Procfile, assurez-vous de lui dire de traiter la file d'attente des expéditeurs, par exemple.

worker: bundle exec sidekiq -q default -q mailers

86
Jason Preston