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
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
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!
À 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.
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
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!
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
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