Resque在heroku上失去与redis的连接

时间:2013-09-14 03:50:57

标签: heroku redis resque grape

我在heroku上运行一个应用程序。 Web工作者是在Grape框架中开发的。

由于Grape没有像config / initializers这样的东西,我在每次访问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工作人员停止从Redis获取工作,即使有些人在那里排队。在本地运行时一切正常。

知道我做错了什么吗?或者我应该在哪里放置Resque的Redis初始化?

1 个答案:

答案 0 :(得分:0)

经过几个小时的调试后,我才开始工作。让我分享一下我的设置中出错的部分:

  • :thread_safe => true :应将Redis实例创建为线程安全。不知道在这种情况下它意味着什么,在Redis源代码中没有找到任何内容,但这就是他们的建议:http://redistogo.com/documentation/resque
  • 确保为网络服务器和工作进程分别仅为Resque分配redis :我最终得到了这样的代码:

      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应用程序和工作者Rakefile中都需要它们
  • 确保没有使用相同的Redis服务器:我发现另一个heroku应用中的工作人员已将此redis设置为resque并继续将这些作业从队列中取出。工作人员配置错误,如果没有注意到工作就失败了
  • 确保您的Redis中没有垃圾:我必须清除Redis的全部内容,以确保没有错误的工作人员注册。
  • 确保您将队列中的作业排队并且这些作业具有正确的优先级对我来说,这是Procfile中的以下设置

    resque: TERM_CHILD=1 VERBOSE=1 QUEUES=activity,polling bundle exec rake jobs:work
    

通过这种设置,它可以很好地工作。希望它对某些人有所帮助,因为非rails应用程序的文档不多。