标签: sidekiq

Rails:在Heroku上启动Sidekiq

我在使用Heroku部署的Rails应用程序启动并运行Sidekiq时遇到问题.我的应用程序在开发中运行良好(在没有Sidekiq的Heroku上).

我创建了一个Procfile:

worker: bundle exec sidekiq
Run Code Online (Sandbox Code Playgroud)

如果我跑heroku ps,我看到的唯一过程是web.1.

我应该为Sidekiq看一个吗?

我收到一个错误:

Redis::CannotConnectError (Error connecting to Redis on localhost:6379) 在我的Heroku日志中.

更新:发现我可能需要heroku addons:add redistogo.还是行不通.我觉得我缺少一些基本的配置.

我需要做些什么才能让Redis启动并运行我的Heroku应用程序?

我一直在使用Redis/Sidekiq大约一天,所以这对我来说是新的.

谢谢!

格雷格

ruby-on-rails heroku sidekiq

39
推荐指数
4
解决办法
3万
查看次数

异步发送邮件时"SSL_read:cert已在哈希表中"

我不断收到OpenSSL::SSL::SSLError一条消息,说明SSL_read: cert already in hash table何时与ActionMailer异步发送延迟的电子邮件.

我们使用Sidekiq以异步方式发送所有电子邮件.当在Sidekiq GitHub回购中将此问题作为问题提出时,我被告知Sidekiq对SSL连接一无所知或管理SSL连接.

我们的应用程序托管在正在运行的Heroku上OpenSSL 0.9.8k 25 Mar 2009.

我们在其他工作中已经多次看到这个错误,并且发现有时候工作会得到处理,但有时他们却没有.

这是一个OpenSSL线程问题,其中多个Sidekiq线程试图使用相同的SSL连接?有没有解决这个问题?

这是我们得到的堆栈跟踪:

    [PROJECT_ROOT]/vendor/ruby-2.0.0/lib/ruby/2.0.0/openssl/buffering.rb:175:in `sysread_nonblock`
    [PROJECT_ROOT]/vendor/ruby-2.0.0/lib/ruby/2.0.0/openssl/buffering.rb:175:in `read_nonblock`
    [PROJECT_ROOT]/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/protocol.rb:153:in `rbuf_fill`
    [PROJECT_ROOT]/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/protocol.rb:134:in `readuntil`
    [PROJECT_ROOT]/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/protocol.rb:144:in `readline`
    [PROJECT_ROOT]/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/smtp.rb:932:in `recv_response`
    [PROJECT_ROOT]/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/smtp.rb:903:in `block in data`
    [PROJECT_ROOT]/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/smtp.rb:942:in `critical`
    [PROJECT_ROOT]/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/smtp.rb:896:in `data`
    [PROJECT_ROOT]/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/smtp.rb:663:in `block in send_message`
    [PROJECT_ROOT]/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/smtp.rb:852:in `rcptto_list`
    [PROJECT_ROOT]/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/smtp.rb:663:in `send_message`
    [PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/mail-2.5.4/lib/mail/network/delivery_methods/smtp.rb:113:in `block in deliver!`
    [PROJECT_ROOT]/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/smtp.rb:521:in `start`
    [PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/mail-2.5.4/lib/mail/network/delivery_methods/smtp.rb:112:in `deliver!`
    [PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/mail-2.5.4/lib/mail/message.rb:2129:in `do_delivery`
    [PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/mail-2.5.4/lib/mail/message.rb:232:in `block in deliver`
    [PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionmailer-4.0.3/lib/action_mailer/base.rb:456:in `block in deliver_mail`
    [PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.3/lib/active_support/notifications.rb:159:in `block in instrument`
    [PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.3/lib/active_support/notifications/instrumenter.rb:20:in `instrument`
    [PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/activesupport-4.0.3/lib/active_support/notifications.rb:159:in `instrument`
    [PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/actionmailer-4.0.3/lib/action_mailer/base.rb:454:in `deliver_mail`
    [PROJECT_ROOT]/vendor/bundle/ruby/2.0.0/gems/mail-2.5.4/lib/mail/message.rb:232:in `deliver` …
Run Code Online (Sandbox Code Playgroud)

ruby openssl ruby-on-rails heroku sidekiq

37
推荐指数
1
解决办法
1374
查看次数

如何删除sidekiq中的作业

我在我的rails应用程序中使用sidekiq.我的应用程序的用户创建启动sidekiq作业的报告.但是,有时用户希望能够取消"处理"报告.删除报告很简单,但我也需要能够删除sidekiq作业.

到目前为止,我已经能够获得这样的工人列表:

workers = Sidekiq::Workers.new
Run Code Online (Sandbox Code Playgroud)

并且每个worker都有包含report_id的args,因此我可以识别哪个作业属于哪个报告.但是,我不确定如何实际删除该作业.应该注意的是,我想删除作业当前是忙还是重试.

ruby-on-rails sidekiq

36
推荐指数
5
解决办法
4万
查看次数

Sidekiq错误连接到Docker-compose上的127.0.0.1:6379(Errno :: ECONNREFUSED)上的Redis

我正在尝试使用Rails运行sidekiq worker.当我尝试时,docker-compose up worker我收到以下错误:

worker_1 | Error connecting to Redis on 127.0.0.1:6379 (Errno::ECONNREFUSED)
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis/client.rb:332:in `rescue in establish_connection'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis/client.rb:318:in `establish_connection'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis/client.rb:94:in `block in connect'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis/client.rb:280:in `with_reconnect'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis/client.rb:93:in `connect'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis/client.rb:351:in `ensure_connected'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis/client.rb:208:in `block in process'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis/client.rb:293:in `logging'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis/client.rb:207:in `process'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis/client.rb:113:in `call'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis.rb:211:in `block in info'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis.rb:57:in `block in synchronize'
worker_1 | /usr/lib/ruby/2.2.0/monitor.rb:211:in `mon_synchronize'
worker_1 | /home/app/Nyvur/vendor/bundle/ruby/2.2.0/gems/redis-3.2.2/lib/redis.rb:57:in …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails redis sidekiq docker docker-compose

34
推荐指数
3
解决办法
3万
查看次数

Redis引发错误:NOAUTH需要身份验证,但没有密码设置

当我通过命令连接到Redis服务器时,我收到错误NOAUTH身份验证:redis-cli并运行ping以检查Redis是否正常工作.

我找到了NOAUTH Authentication required错误的答案,该错误描述了只有当Redis设置了密码时才会发生此错误,但我检查了Redis配置文件,etc/redis/redis.conf并且没有设置密码.

Redis配置

有没有人知道,如果有其他设置可以导致此错误?谢谢你的帮助.

p/s:我使用的是Ruby on Rails Web框架,Redis数据库用于Sidekiq.

编辑:Redis版本是2.8.4.服务器托管在AWS上.

目前,我决定为Redis服务器设置一个密码,以便在运行时无法设置密码.

(重新启动Redis服务器时,它将正常工作.您可以运行sudo service redis-server restart以重新启动Redis服务器.)

ruby-on-rails redis sidekiq ruby-on-rails-4

33
推荐指数
4
解决办法
3万
查看次数

Sidekiq在工人完成后没有释放内存

我有大约六个执行JSON爬行的Sidekiq工作者.根据端点的数据集大小,它们在1分钟到4小时之间完成.特别是,观看长达4小时的长时间,我看到随着时间的推移,内存会略有增加.

这不是问题,直到我想再次安排相同的工作人员工作.内存没有被释放并堆积起来,直到我遇到Linux OOM Killer,摆脱了我的Sidekiq进程.

内存泄漏?我在ObjectSpace中观察了不同对象的数量:

ObjectSpace.each_object.inject(Hash.new(0)) { |count, o| count[o.class] += 1 }
Run Code Online (Sandbox Code Playgroud)

那里没有真正的增加,哈希,数组等的集合保持不变,垃圾收集器一扫而空,并gc.stat[:count]告诉我,垃圾收集器也在工作.

即使在工作人员完成之后,例如我得到[完成]记录并且没有工人正忙,但内存不会被释放.这是什么原因?我可以对此做点什么吗?写一个终结者?

目前唯一的解决方案:重启Sidekiq进程.

我在Ruby 2.0.0上使用Ruby MRI.


对于JSON解析,我使用Yajl,因此是C绑定.我需要它,因为它似乎是唯一能够正确实现流式读写的快速JSON解析器.

ruby memory-leaks memory-management out-of-memory sidekiq

30
推荐指数
1
解决办法
9277
查看次数

Sidekiq Rails 4.2使用活动作业还是工作者?有什么不同

这是我第一次异步处理作业我在我的应用程序中实现Sidekiq进行后台处理.我会将它用于提醒电子邮件和应用内通知.我很困惑我是否应该使用Active Job创建一个发送电子邮件的工作或者Sidekiq Worker来发送电子邮件.他们似乎做同样的事情,Rails 4.2 Active Job似乎很新......它是否取代了对Sidekiq工作者的需求?

以下是使用Active Job作业和Sidekiq Worker发送邮件代码的相同内容.我正在使用Whenever gem进行调度.

my_mailers.rb

class MyMailers < ActionMailer::Base

  def some_mailer(r.user_id)
    @user = User.find(r.user_id)
    mailer_name = "ROUNDUP"
    @email = @user.email
    @subject ="subject text"
    mail(to: @email, 
      subject: @subject,  
      template_path: '/notifer_mailers', 
      template_name: 'hourly_roundup.html',
      )
  end
end
Run Code Online (Sandbox Code Playgroud)

使用Sidekiq"Worker"
some_worker.rb

class SomeWorker
  include Sidekiq::Worker

  def perform()
    @user = User.all
    @reminders = @user.reminders.select(:user_id).uniq.newmade
    @reminders.each do |r|
      MyMailers.some_mailer(r.user_id).deliver_later
    end
  end

end
Run Code Online (Sandbox Code Playgroud)

使用活动作业"作业"
some_job.rb

class SomeJob < ActiveJob::Base
  queue_as :mailer

  def perform()
    @user = User.all
    @reminders = @user.reminders.select(:user_id).uniq.newmade
    @reminders.each do |r| …
Run Code Online (Sandbox Code Playgroud)

asynchronous ruby-on-rails whenever sidekiq rails-activejob

30
推荐指数
3
解决办法
1万
查看次数

在多线程Rails环境中使用Redis的最佳方法是什么?(Puma/Sidekiq)

我在我的应用程序中使用Redis,包括Sidekiq队列和模型缓存.

考虑到将从我的Web应用程序(通过Puma运行)和Sidekiq内部的后台作业调用将要访问Redis的模型,我的模型可以使用Redis连接的最佳方法是什么?

我目前在我的初始化器中执行此操作:

Redis.current = Redis.new(host: 'localhost', port: 6379)
Run Code Online (Sandbox Code Playgroud)

然后在整个代码中使用Redis.current.get/ Redis.current.set(和类似的)...

据我所知,这应该是线程安全的,因为Redis客户端只使用Monitor一次运行一个命令.

现在,Sidekiq拥有自己的Redis连接池,并建议这样做

Sidekiq.redis do |conn|
   conn.get
   conn.set
end
Run Code Online (Sandbox Code Playgroud)

据我所知,这比使用Redis.current的方法更好,因为当他们命中Redis时,多个线程上没有多个工作线在一个连接上互相等待.

但是,如何才能将我从Sidekiq.redis获得的连接提供给我的模型?(无需在每个方法调用中将其作为参数传递)

我无法在该块中设置Redis.current,因为它是全局的,并且我回到每个人使用相同的连接(以及它们之间随机切换,甚至可能是非线程安全的)

我应该将从Sidekiq.Redis获得的连接存储到Thread-local变量中,并在任何地方使用该线程局部变量?

在这种情况下,我在"Puma"环境中做了什么?如何设置线程局部变量?

对此有任何想法非常感谢.

谢谢!

ruby thread-safety redis sidekiq ruby-on-rails-4

29
推荐指数
1
解决办法
6958
查看次数

优雅地关闭sidekiq进程

有谁知道如何找到sidekiq的pidfile优雅地关闭它?运行ps ax | grep sidekiq然后sidekiqctl stop <pid from grep>一直运行会no such pidfile出错?Cntl-C和Cntl-D似乎也没有效果.

关闭进程窗口并重新打开新窗口不会终止进程,因为它似乎作为守护进程运行.

我发现的唯一一致修复是重启.

ruby sidekiq

26
推荐指数
4
解决办法
3万
查看次数

如何在RubyMine中启动Sidekiq?

我正在使用RubyMine 6.3.我试图在RubyMine中配置Sidekiq,但我无法启动它.

如何在RubyMine中配置和启动Sidekiq?

rubymine sidekiq

26
推荐指数
1
解决办法
2899
查看次数