我在 heroku 上运行一个应用程序。 Web Worker是在Grape框架下开发的。
由于 Grape 没有配置/初始化器之类的东西,我在每次访问 Resque 之前运行这样的代码:
HEROKU_REDIS_URL = "redis://redistogo:XXXXX@squawfish.redistogo.com:9990/"
uri = URI.parse(HEROKU_REDIS_URL)
Resque.redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password, :thread_safe => false)
一段时间后,Resque worker 停止从 Redis 中获取作业,即使有些作业已经在那里排队。在本地运行时一切正常。
知道我做错了什么吗?或者Resque的Redis初始化应该放在什么地方?
最佳答案
经过几个小时的调试,我让它工作了。让我分享一下我的设置中哪些部分有问题:
- :thread_safe => true:Redis 实例应该创建为线程安全的。不确定在这种情况下这意味着什么,在 Redis 源代码中没有找到任何内容,但这就是他们在以下内容中的建议:http://redistogo.com/documentation/resque
确保为 Web 服务器和工作进程将 redis 仅分配给 Resque 一次:我最终得到了这样的代码:
require 'resque' if ENV["REDIS_SERVICE"] begin Resque.redis.get('abc') rescue Redis::CannotConnectError HEROKU_REDIS_URL = "redis://redistogo:XXXXX@squawfish.redistogo.com:9990/" uri = URI.parse(HEROKU_REDIS_URL) Resque.redis = Redis.new( :host => uri.host, :port => uri.port, :password => uri.password) end end
我将它放在 app/resque_redis_init.rb 中,并在
resque:setup
任务中的 Web 应用和 worker Rakefile 中都需要- 确保没有任何东西使用同一个 Redis 服务器:我发现另一个 heroku 应用程序中的一个工作人员将这个 redis 设置为 resque 并不断吃掉队列中的作业。工作人员配置错误,工作在我没有注意到的情况下失败了
- 确保您的 Redis 中没有垃圾:我必须清除 Redis 的所有内容以确保没有注册错误的工作人员。
确保您在正确的队列中对作业进行排队,并且这些作业具有正确的优先级对我来说,这是 Procfile 中的以下设置
resque: TERM_CHILD=1 VERBOSE=1 QUEUES=activity,polling bundle exec rake jobs:work
有了这个设置,它工作得很好。希望它对某人有所帮助,因为那里没有太多关于非 Rails 应用程序的文档。
关于heroku - Resque失去与heroku上redis的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18798095/