Can Resque workers run without a copy of redis running? - ruby-on-rails-3

I start a worker with:
rake environment resque:work RAILS_ENV=development VVERBOSE=1 QUEUE=* LOGFILE=/Users/matteo/workspace/APP/log/resque.log --trace
I get the output:
** Invoke environment (first_time)
** Execute environment
** Invoke resque:work (first_time)
** Invoke resque:preload (first_time)
** Invoke resque:setup (first_time)
** Execute resque:setup
** Execute resque:preload
** Invoke resque:setup
** Execute resque:work
A quick ps tells me the process is up and running.
Now I do NOT have an instance of Redis running. A quick ps auxwwww | grep redis-server confirms that.
Shouldn't the worker fails?
I downloaded the resque code and put a breakpoint into the resque code in worker.rb:
(rdb:1) eval redis
#<Redis::Namespace:0x007f868cb57880 #namespace=:resque, #redis=#<Redis client v2.2.2 connected to redis://127.0.0.1:6379/1 (Redis v0.07)>>
How is this possible nothing is running on that port?
Thanks for any help

The answers is: "No, workers cannot run without a copy of Redis running".
The problem was caused by the fakeredis gem. Even though the gem was not included in the development environment the developer was requiring "redis/connction/memory" therefore using a fakeredis instance.

Resque definetely requires redis to work, although it may appear that your queue is up, it will fail to process without redis.
You can view the status of your queues by going to this url after booting up your server...
http://localhost:3000/resque/overview
That is if you have the following in your gemfile
gem 'resque', :require => "resque/server"
OR if you don't have that setup run this in the console resque-web to get the admin interface accessible at localhost:3000/overview
If you don't get an error and can access that page without a redis error, redis must be running somewhere, perhaps as a service on bootup?
For basic redis/resque setup see here - http://railscasts.com/episodes/271-resque?view=asciicast

Related

Can't kill rails rake task

I have a Rails 3.2.14 app with a rake task that listens for gps coordinates. I'm implementing a new method of collecting gps data that doesn't require a rake task to listen. So I'm trying to kill the rake task(s) that are spun up on my production server.
I did a ps aux | grep rake to get a list of the rake instances I want to kill and issued a kill "pid" and even the ugly kill -9 "pid" but the rake tasks keeps respawning. There are three instances of the rake task that are running that I need to kill. Is there a better way to kill these rake tasks then what I'm doing? I've also tried doing a killall -9 rake but it says rake: no process found
Any thoughts on how to stop this task would be greatly appreciated.
Actually I was able to kill the rake processes via Capistrano through a Capistrano task I wrote a while back. This killed all instances, now to remove the task from my app entirely.

how to run rake task in background in rails

This is my command
bundle exec rake resque:work QUEUE="*" --trace
I want to run this command on my server as a background process.
please help me.
A method I often use is:
nohup bundle exec rake resque:work QUEUE="*" --trace > rake.out 2>&1 &
This will keep the task running even if you exit your shell. Then if I want to just observe trace output live, I do:
tail -f rake.out
And you can examine rake.out at any time.
If you need to kill it before completion, you can find it with ps and kill the pid.
Just in case somebody finds this 4 years later, bundle has an elegant way of doing this now. For example if you want to run sidekiq in the background you can do:
bundle exec sidekiq -e production -d -L ./log/sidekiq.log
The -d daemonizes to run in the background, but you will also need to use the -L to provide a logfile, else bundler will refuse to run your command in the background (deamonize).
Tested with bundler version 1.15.4
Update Oct 2019.
While the command still works in general, the specific command above will no longer work for sidekiq 6.0+, you'll need to use Upstart or Systemd if you use Linux: https://github.com/mperham/sidekiq/wiki/Deployment#running-your-own-process

Sidekiq not processing queue

What possible reasons can Sidekiq prevent from processing jobs in the queue? The queue is full. The log file sidekiq.log indicates no activity at all. Thus the queue is full but the log is empty, and Sidekiq does not seem to process items. There seem to no worker processing jobs. Restarting Redis or flush it with FLUSHALL or FLUSHDB has no effect. Sidekiq has been started with
bundle exec sidekiq -L log/sidekiq.log
and produces the following log file:
2013-05-30..Booting Sidekiq 2.12.0 using redis://localhost:6379/0 with options {}
2013-05-30..Running in ruby 1.9.3p374 (2013-01-15 revision 38858) [i686-linux]
2013-05-30..See LICENSE and the LGPL-3.0 for licensing details.
2013-05-30..Starting processing, hit Ctrl-C to stop
How can you find out what went wrong? Are there any hidden log files?
The reason was in our case: Sidekiq may look for the wrong queue. By default Sidekiq uses a queue named "default". We used two different queue names, and defined them in config/sidekiq.yml
# configuration file for Sidekiq
:queues:
- queue_name_1
- queue_name_2
The problem is that this config file is not automatically loaded by default in your development environment (unlike database.yml or thinking_sphinx.yml for instance) by a simple bundle exec sidekiq command. Thus we wrote our jobs in two certain queues, and Sidekiq was waiting for jobs in a third queue (the default one). You have to pass the path to the config file as a parameter through the -Cor --config option:
bundle exec sidekiq -C ./config/sidekiq.yml
or you can pass the queue names directly (no spaces allowed here after the comma):
bundle exec sidekiq -q queue_name_1,queue_name_2
To find the problem out it is helpful to pass the option -v or --verbose at the command line, too, or to use :verbose: true in the sidekiq.yml file. Everything which is defined in a config file is of course useless if the config file is not loaded.. Therefore make sure you are using the right config file first.
If you have a config/sidekiq.yml check that all the queues are defined there, check this sample file: https://github.com/mperham/sidekiq/blob/master/examples/config.yml
If you are passing queue names in the command line or Procfile, something similar to
bin/sidekiq -q queue1 -q queue2
bundle exec sidekiq -q queue1 -q queue2
check that all your queues are defined there.
In case you are not sure about the names of your queues, you can figure it out with the following script:
require "sidekiq/api"
stats = Sidekiq::Stats.new
stats.queues
# {"production_mailers"=>25, "production_default"=>1}
Then, you can do things with the queues:
queue = Sidekiq::Queue.new("production_mailers")
queue.count
queue.clear
It took me hours to find out that I had set config.active_job.queue_name_prefix = "xxxxx_#{Rails.env}". The queue names in the settings look the same, but sidekiq looks for the queue with prefix.
Wrong setting
app/jobs/my_job.rb
class MyJob < ApplicationJob
queue_as :default
end
config/sidekiq.yml
:queues:
- default
Correct setting
app/jobs/my_job.rb
class MyJob < ApplicationJob
queue_as :default
end
config/sidekiq.yml
:queues:
- xxxxx_development_default
- xxxxx_production_default
My problem was I had a configure_server but not configure_client in my initialiser, you must have both:
Sidekiq.configure_server do |config|
config.redis = { url: ENV.fetch('SIDEKIQ_REDIS_URL', 'redis://127.0.0.1:6379/1') }
end
Sidekiq.configure_client do |config|
config.redis = { url: ENV.fetch('SIDEKIQ_REDIS_URL', 'redis://127.0.0.1:6379/1') }
end
In my case, sidekiq was fine in development, but stuck in staging. It was human error on the capistrano's deploy configuration. I set the path for sidekiq.yml incorrectly in the Capfile (shared instead of current).
It failed silently:
# Capfile
# WRONG:
set :sidekiq_config, -> { File.join(shared_path, 'config', 'sidekiq.yml') }
^^^^^^^^^^^
# RIGHT:
set :sidekiq_config, -> { File.join(current_path, 'config', 'sidekiq.yml') }
flushing redis worked for me.
WARNING: THIS WILL REMOVE ALL DATA IN YOUR REDIS DATABASE.
redis-cli flushall
I was banging my head against a brick wall on this for a while, my issue was that sidekiq required a newer version of redis-server. I ran "bundle exec sidekiq" and that revealed the error. Once I updated to a newer version of redis-server it was fine.
I just had this issue. Turns out I had made a syntax error in my sidekiq.yml
Spent at least two hours on this as well because queues and configuration and web UI were all fine ... the jobs were just not processed.
My issue was that the sidekiq-server was not running in my docker-compose setup even though it should have been started in the command-section here:
sidekiq:
depends_on:
- 'proddb'
- 'redis'
build: rails-app
--> command: bundle exec sidekiq --environment ${RAILS_ENV} -C config/sidekiq.yml
volumes:
- './rails-app:/project'
- '/project/tmp' # don't mount tmp directory
environment:
- REDIS_URL_SIDEKIQ=${REDIS_URL_SIDEKIQ}
networks:
- backend
My problem was I did not config my initializers/sidekiq.rb properly but even with the correct config, sidekiq was still not running enqueued jobs. I had to run spring stop on top of that and restarted everything and it solved my issue.
I encountered a similar problem wherein the logs would show entries such as INFO Rails : queueing TestWorker (TestWorker). However, the jobs would never get processed, and none of the answers in this question solved the issue.
The tl;dr to my solution is that Sidekiq's Testing Client was getting unexpectedly triggered.
I eventually deduced that there is some "magic" going on underneath the surface that makes it difficult to discretely determine where/when/how the above testing trigger was getting configured, based on the following anecdote...
Running bundle exec sidekiq -C config/sidekiq.yml -e development had the result that Sidekiq::Testing.fake? == true
However, running bundle exec sidekiq -C config/sidekiq.yml -e development_2 had the result that Sidekiq::Testing.fake? == false
^ The only difference between these 2 commands is that I renamed the development environment in sidekiq.yml to development_2, i.e. the same/equivalent environment was running with both commands (at least, presumably it would be the same environment if it wasn't for this inane "magic" under the hood).
I updated sidekiq.rb to explicitly toggle Sidekiq::Testing via the following:
sidekiq_testing_fake = false # set this using env var, etc.
if sidekiq_testing_fake
Sidekiq::Testing.fake!
elsif Sidekiq.constants.include?(:Testing)
Sidekiq::Testing.disable!
end
My issue was that I had both a redis-server running and Redis.app's redis-server running, I killed the redis-server (and kept the Redis.app one)

God does not stop delayed_job worker

I need to monitor my delayed_job worker with god. It starts perfectly, but when i want to stop it using "sudo god stop dj" it says
Sending 'stop' command
The following watches were affected:
dj-0
But worker is still on(it processes tasks etc.)
I looked through sites providing their god configs for delayed_job and stop command wasn't specified there. Do I need to specify stop task for god config or smth?
I start delayed_job with w.start = "cd #{rails_root} && QUEUE=work_server1 bundle exec rake -f #{rails_root}/Rakefile RAILS_ENV=#{environment} --trace jobs:work"
I've solved this problem. The reason was that using "bundle exec" two processes were spawned and god was monitoring the wrong one. So I've just upgraded rake to not use "bundle exec" and it works.

Resque priority queue with Heroku & Procfile. Crashes

On my local machine I can do
QUEUES=a,b,c,d rake resque:work
And it processes those queues in that order. However, on Heroku Cedar I add this to my procfile:
worker: QUEUES=a,b,c,d exec bundle exec rake resque:work
And it crashes the app on deploy. I'm probably missing something dumb, but I'm stumped.
PS I prefix the command with exec because of a bug with resque not properly decrementing the worker count.
You shouldn't need the initial exec. The entry should look like this:
worker: bundle exec rake resque:work QUEUE=a,b,c,d
Use #hone's fork to properly clean up workers when they quit. In your Gemfile:
gem 'resque', git: 'https://github.com/hone/resque.git', branch: 'heroku', require: 'resque/server'