web-dev-qa-db-fra.com

Rails: Démarrage de Sidekiq sur Heroku

J'ai un problème pour que Sidekiq soit opérationnel sur mon Heroku déployé Rails app. Mon application fonctionne bien en développement (et sur Heroku sans Sidekiq).

J'ai créé un Procfile avec:

worker: bundle exec sidekiq

Si j'exécute heroku ps, Le seul processus que je vois est web.1.

Dois-je en voir un pour Sidekiq?

Je reçois une erreur:

Redis::CannotConnectError (Error connecting to Redis on localhost:6379) dans mes journaux Heroku.

MISE À JOUR: J'ai trouvé que j'avais probablement besoin de heroku addons:add redistogo. Ne fonctionne toujours pas. Je sens que je manque une configuration de base.

Dois-je faire quelque chose pour que Redis soit opérationnel pour mon application Heroku?

J'utilise Redis/Sidekiq depuis environ une journée, c'est donc nouveau pour moi.

Merci!

Greg

39
Greg Rogers

Non, vous n'avez pas besoin de configuration avec Heroku pour Sidekiq, ajoutez simplement le plugin RedisToGo et c'est parti. N'oubliez pas d'attribuer au moins 1 travailleur à votre application dans votre configuration Heroku.

Voici mon Procfile par défaut:

web: bundle exec thin start -p $PORT
worker: bundle exec sidekiq -c 5 -v
53
gdurelle

Cela vaut la peine de vérifier si le processus sidekiq est vraiment démarré avec cette commande:

heroku ps

S'il n'y a pas de travailleur, vous devrez peut-être exécuter cette commande:

heroku ps:scale worker+1

Il s'avère qu'il y a un bug dans l'interface utilisateur Web en ce sens que certains membres de l'équipe n'étaient pas autorisés à augmenter le nombre de travailleurs de 0 à 1, même si l'interface utilisateur semblait le montrer!

35
justingordon

À partir de la version 3.0 de sidekiq, il existe une étape supplémentaire, exécutez heroku config:set REDIS_PROVIDER=REDISTOGO_URL dans la console.

Voici le processus que j'ai utilisé pour Rails 4:

Dans la console:

heroku addons:create redistogo
heroku config:set REDIS_PROVIDER=REDISTOGO_URL

Dans mon Procfile j'ai ajouté:

worker: bundle exec sidekiq

Dans mon gemfile.rb J'ai ajouté:

gem 'redis'

J'ai ajouté le fichier suivant, config/initializers/redis.rb:

uri = ENV["REDISTOGO_URL"] || "redis://localhost:6379/"
REDIS = Redis.new(:url => uri)

Voici le lien vers les documents sidekiq.

16
Steve

Vous pouvez bien sûr exécuter sidekiq à côté de votre file d'attente de travaux actuelle.

Notre Procfile ressemble actuellement à ceci:

web: bundle exec thin start -R config.ru -e $Rails_ENV -p $PORT
worker:  bundle exec rake jobs:work
sidekiq: bundle exec sidekiq -c 5 -v
1
superluminary

Compléter la réponse de Gdurelle:

Vous avez besoin d'une configuration avec Heroku pour Sidekiq:

1) Faire installer les gemmes Sidekiq et Redis (en gemfile et en bundle), dans mon cas:

Gemfile

gem 'redis', '~> 3.1'
gem 'sidekiq', '~> 2.7', '>= 2.7.1'

2) Ajoutez un travailleur, si vous n'avez pas de travailleurs créés localement, je vous suggère d'en créer au moins un, juste au cas où, utilisez ceci:

Rails g sidekiq:worker Hard # will create app/workers/hard_worker.rb

devrait créer ceci:

app/workers/hard_worker.rb

class HardWorker
  include Sidekiq::Worker
  def perform(name, count)
    # do something
  end
end

3) Ajoutez le module complémentaire Redis (dans mon cas Heroku Redis):

heroku addons:create heroku-redis:hobby-dev

4) Ajoutez votre fichier redis.rb, dans mon cas:

config/initializers/redis.rb

$redis = Redis.new(url: ENV["REDIS_URL"])

5) Ajoutez Procfile ou config/sidekiq.yml ou les deux, voici les miens:

Procfile

worker: bundle exec sidekiq -c 1 -q default -q mailers 

que vous pouvez créer plus facilement en collant cela dans votre terminal

echo "worker: bundle exec sidekiq -c 1 -q default -q mailers" > Procfile

config/sidekiq.yml

:concurrency: 1
:queues:
  - [mailers, 7]
  - [default, 5]

6) La partie la plus importante est ici et allumez l'interrupteur pour votre travailleur, cliquez sur le crayon, puis allumez l'interrupteur manquant. Les choses devraient bien fonctionner maintenant, bonne journée!

1
Jose Paez

Ce que j'ai découvert, c'est que vous devez faire évoluer le processus manuellement comme ceci:

heroku ps:scale worker+1

Cela n'a aucun sens puisque mon Procfile a dit:

web: bundle exec....
worker: bundle exec sidekiq

... et on se serait attendu à ce que Heroku démarre automatiquement le travailleur. Au final, je n'ai pas eu à faire évoluer le processus web ...

En outre, vous pourriez avoir des problèmes avec cette ligne: worker: bundle exec sidekiq

Ajoutez des indicateurs de concordance:

worker: bundle exec sidekiq -c 5 -v
1
luigi7up

On dirait que vous y êtes presque. Il se peut que vous ayez juste besoin de définir REDISTOGO_URL sur config herok ?

heroku config 

devrait vous montrer la valeur redistogo?

Si vous copiez cela dans REDISTOGO_URL, alors sidekiq devrait fonctionner?

heroku config:add REDISTOGO_URL=<redistogo value>

Edit: Sidekiq utilisera l'un de ceux-ci actuellement: https://github.com/mperham /sidekiq/blob/master/lib/sidekiq/redis_connection.rb#L29-L

Edit2: Greg a raison en ce que vous n'avez pas besoin d'ajouter la configuration si vous utilisez RedisToGo. Mais si vous utilisez OpenRedis ou d'autres fournisseurs Redis, vous devez ajouter REDISTOGO_URL pour Sidekiq

1
gef