簡體   English   中英

docker + rails + redis - 救援人員沒有運行

[英]docker + rails + redis - rescue workers are not running

我創建了一個可以創建3個圖像的docker環境:rails,postgresql和redis。 它一直運作良好,但我發現我的redis圖像似乎沒有任何工人運行。

Docker信息

我的docker-compose.yml如下

web:  
  build: .
  command: bundle exec unicorn -p 3000 -c config/unicorn.rb
  volumes:
    - .:/fitmo
    - ../fitmo-core:/fitmo-core
  ports:
    - "3000:3000"
  links:
    - db
    - redis
  environment:
    - REDIS_URL=redis://redis:6379

db:
  build: ./db/docker-files
  ports:
    - "5432"

redis:  
  image: redis:2.8
  ports:
    - "6379"

Resque配置

require 'resque'
require 'resque-scheduler'
require 'resque_scheduler/server'
require 'appsignal/integrations/resque'
require 'yaml'

if Rails.env.test?
  require 'mock_redis'
  $redis = MockRedis.new
else
  uri = URI.parse(ENV['REDIS_URL'])
  $redis = Redis.new(host: uri.host, port: uri.port, password: uri.password)
end

Resque.redis = $redis
Resque.schedule = YAML.load_file(File.join(Rails.root, 'config/resque_schedule.yml'))

Resque.before_fork do
  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end

Resque.after_fork do
  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end

module Resque

  def queued_jobs
    queues = Hash.new
    Resque.queues.each do |queue|
      jobs = []
      Resque.peek(queue, 0, 5000).each do |job|
        jobs.push({klass: job['class'], args: job['args']})
      end
      queues[queue] = jobs
    end
    queues
  end

  def queued?(klass, *args)
    queued_jobs.select do |job|
      job[:klass] == klass.to_s && job[:args] == args
    end.any?
  end

  def enqueue_once(klass, *args)
    enqueue(klass, *args) unless queued?(klass, *args)
  end

end

Ruby Gems

以下是使用的相關寶石。 注釋掉的版本是寶石的最新版本,但我不認為這是一個問題,因為當前版本在Heroku環境中運行良好。 我還包括救援郵件和調度程序的徹底性。 他們沒有參與這個問題

gem 'redis',            '3.0.7'         #'~> 3.2.0'
gem 'resque',           '~> 1.25.2'     #'~> 1.25.2'
gem 'resque_mailer',    '~> 1.0.1'      #'~> 2.2.7'
gem 'resque-scheduler', '~> 2.5.5'      #'~> 4.0.0'

測試信息

我已經確認可以通過telnet到端口6379上的主機redis從Web容器訪問redis。我還輸出Rescue.info的值,該值顯示有項目已排隊但現在正在運行的工作程序

resque info: {:pending=>1, :processed=>0, :queues=>2, :workers=>0, :working=>0, :failed=>0, :servers=>["redis://redis:6379/0"], :environment=>"development"}

我堅持這一點,因為我不確定如何讓工人跑步。 有什么建議?

我能夠通過包含基於Web圖像啟動的新圖像來解決這個問題。 我的新docker-compose.yml文件如下(添加了新的worker圖像):

web:  
  build: .
  command: bundle exec unicorn -p 3000 -c config/unicorn.rb
  volumes:
    - .:/fitmo
    - ../fitmo-core:/fitmo-core
  ports:
    - "3000:3000"
  links:
    - db
    - redis
  environment:
    - REDIS_URL=redis://redis:6379

worker:
  build: .
  command: bundle exec rake environment resque:work QUEUE=*
  volumes:
    - .:/fitmo
    - ../fitmo-core:/fitmo-core
  links:
    - db
    - redis
  environment:
    - REDIS_URL=redis://redis:6379

db:
  build: ./db/docker-files
  ports:
    - "5432"

redis:  
  image: redis:latest
  ports:
    - "6379"

如果您安裝了AppSignal gem並且使用“extend Appsignal :: Integrations :: ResquePlugin”擴展您的作業,則會出現后續問題。問題是ResquePlugin嘗試將套接字寫入tmp文件夾而Docker不允許它。

我確定有一個Docker配置允許寫入套接字,但我在我的appsignal.yml文件中創建了一個開發部分,並將活動標志設置為false。 即使active = false,最新版本的Appsignal gem仍會嘗試寫入套接字。 寶石的版本0.13.0(將於明天發布)應該有一個固定的位置

appsignal.yml

production:
  api_key: "xxxxxxxxxxxxxxxxxxxxxxxx"
  active: true
  slow_request_threshold: 200
staging:
  api_key: "xxxxxxxxxxxxxxxxxxxxxxxx"
  active: true
  slow_request_threshold: 200
development:
  api_key: "xxxxxxxxxxxxxxxxxxxxxxxx"
  active: false
  slow_request_threshold: 200

在resque的github頁面https://github.com/resque/resque上 ,它提到你需要運行bin/resque work來開始輪詢隊列和啟動worker。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM