我在使用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大约一天,所以这对我来说是新的.
谢谢!
格雷格
我不断收到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) 我在我的rails应用程序中使用sidekiq.我的应用程序的用户创建启动sidekiq作业的报告.但是,有时用户希望能够取消"处理"报告.删除报告很简单,但我也需要能够删除sidekiq作业.
到目前为止,我已经能够获得这样的工人列表:
workers = Sidekiq::Workers.new
Run Code Online (Sandbox Code Playgroud)
并且每个worker都有包含report_id的args,因此我可以识别哪个作业属于哪个报告.但是,我不确定如何实际删除该作业.应该注意的是,我想删除作业当前是忙还是重试.
我正在尝试使用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) 当我通过命令连接到Redis服务器时,我收到错误NOAUTH身份验证:redis-cli
并运行ping
以检查Redis是否正常工作.
我找到了NOAUTH Authentication required错误的答案,该错误描述了只有当Redis设置了密码时才会发生此错误,但我检查了Redis配置文件,etc/redis/redis.conf
并且没有设置密码.
有没有人知道,如果有其他设置可以导致此错误?谢谢你的帮助.
p/s:我使用的是Ruby on Rails Web框架,Redis数据库用于Sidekiq.
编辑:Redis版本是2.8.4.服务器托管在AWS上.
目前,我决定为Redis服务器设置一个密码,以便在运行时无法设置密码.
(重新启动Redis服务器时,它将正常工作.您可以运行sudo service redis-server restart
以重新启动Redis服务器.)
我有大约六个执行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解析器.
这是我第一次异步处理作业我在我的应用程序中实现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) 我在我的应用程序中使用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"环境中做了什么?如何设置线程局部变量?
对此有任何想法非常感谢.
谢谢!
有谁知道如何找到sidekiq的pidfile优雅地关闭它?运行ps ax | grep sidekiq
然后sidekiqctl stop <pid from grep>
一直运行会no such pidfile
出错?Cntl-C和Cntl-D似乎也没有效果.
关闭进程窗口并重新打开新窗口不会终止进程,因为它似乎作为守护进程运行.
我发现的唯一一致修复是重启.
我正在使用RubyMine 6.3.我试图在RubyMine中配置Sidekiq,但我无法启动它.
如何在RubyMine中配置和启动Sidekiq?
sidekiq ×10
ruby ×4
redis ×3
heroku ×2
asynchronous ×1
docker ×1
memory-leaks ×1
openssl ×1
rubymine ×1
whenever ×1