ruby-on-rails - Heroku、Rails、Resque、Redis:所有作业都因 Errno::ETIMEDOUT 而失败

标签 ruby-on-rails heroku redis resque redistogo

我在 heroku 上有一个 Rails 应用程序,它使用 Resque.enqueu 来安排使用 Redis 和 redistogo 的后台作业。

作业过去工作正常,但我现在注意到它们都失败了一段时间(几周,100% 的作业)。

我得到的错误:

Exception Errno::ETIMEDOUT Error Connection timed out - connect(2)

和堆栈跟踪:

> /app/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:878:in `initialize'
> /app/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:878:in `open'
> /app/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:878:in `block in
> connect' /app/vendor/ruby-2.0.0/lib/ruby/2.0.0/timeout.rb:52:in
> `timeout' /app/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:877:in
> `connect' /app/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:862:in
> `do_start' /app/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:851:in
> `start' /app/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:1373:in
> `request' /app/vendor/ruby-2.0.0/lib/ruby/2.0.0/net/http.rb:1131:in
> `get'
> /app/vendor/bundle/ruby/2.0.0/gems/activeresource-4.0.0/lib/active_resource/connection.rb:121:in `block in request'
> /app/vendor/bundle/ruby/2.0.0/gems/activesupport-4.2.1/lib/active_support/notifications.rb:164:in
> `block in instrument'
> /app/vendor/bundle/ruby/2.0.0/gems/activesupport-4.2.1/lib/active_support/notifications/instrumenter.rb:20:in
> `instrument'
> /app/vendor/bundle/ruby/2.0.0/gems/activesupport-4.2.1/lib/active_support/notifications.rb:164:in
> `instrument'
> /app/vendor/bundle/ruby/2.0.0/gems/activeresource-4.0.0/lib/active_resource/connection.rb:118:in `request'
> /app/vendor/bundle/ruby/2.0.0/gems/shopify_api-4.0.6/lib/active_resource/connection_ext.rb:13:in `request_with_detailed_log_subscriber'
> /app/vendor/bundle/ruby/2.0.0/gems/activeresource-4.0.0/lib/active_resource/connection.rb:82:in
> `block in get'
> /app/vendor/bundle/ruby/2.0.0/gems/activeresource-4.0.0/lib/active_resource/connection.rb:216:in `with_auth'
> /app/vendor/bundle/ruby/2.0.0/gems/activeresource-4.0.0/lib/active_resource/connection.rb:82:in
> `get'
> /app/vendor/bundle/ruby/2.0.0/gems/activeresource-4.0.0/lib/active_resource/custom_methods.rb:57:in
> `get'
> /app/vendor/bundle/ruby/2.0.0/gems/shopify_api-4.0.6/lib/shopify_api/countable.rb:4:in
> `count' /app/app/models/shop.rb:263:in `unscanned_customers'
> /app/app/models/shop.rb:230:in `shopify_customers'
> /app/app/models/shop.rb:144:in `bulk_scan'
> /app/app/workers/bulk_scanner.rb:16:in `perform'

我在想这可能与没有正确连接到 Redis 或 redistogo 有关。以下是我拥有的相关初始化代码:

resque.rb:

Resque.redis = RedisConnection.connection

redis_connection.rb:

class RedisConnection
  def self.close
    connection.quit
  end

  def self.connection
    @connection ||= new_connection
  end

  def self.new_connection
    uri = URI.parse(ENV['REDISTOGO_URL'] || 'redis://localhost:6379/')

    Redis.new(host: uri.host,
              port: uri.port,
              password: uri.password,
              thread_safe: true,
              :timeout => 1)
  end
end

如果我在我的应用程序中调用 Resque.redis 或 @connection,它会返回一个 Redis 实例。还有什么会导致此连接错误?我在哪里可以排除故障?

最佳答案

查看 Backtrace,会不会是 Shopify API 连接超时? 看起来 unscanned_customers 应该是可数的 Shopify 集合,当尝试检索客户时会出现问题。

我将从这里开始调试: > 'count'/app/app/models/shop.rb:263:in '未扫描的客户'

此外,我会尝试使用私有(private)应用程序 API key 和密码从服务器连接到 Shopify:

shop_url = "https://#{API_KEY}:#{PASSWORD}@SHOP_NAME.myshopify.com/admin"
ShopifyAPI::Base.site = shop_url

如果需要,请参阅 Shopify API 了解更多详细信息 Shopify API Readme

这将有助于隔离连接问题。

干杯。

关于ruby-on-rails - Heroku、Rails、Resque、Redis:所有作业都因 Errno::ETIMEDOUT 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40920464/

相关文章:

python - 有没有办法绕过 Git 将 local_settings.py 放到 Heroku 中?

ruby-on-rails - 在 Heroku 上的 Rails 中一次显示大量记录

redis - 如果不使用 Rails,如何在 Resque 中设置 Redis url?

ruby-on-rails - 将类添加到生成的表单的正确 button_to 语法是什么?

ruby-on-rails - 使用 Cloudinary 和 Active Storage 时如何设置将文件上传到特定文件夹?

ruby-on-rails - 在 Ruby on Rails 应用程序中加载 .env

redis - Redis ZADD:仅在分数较低时更新

集群中的 Redis PubSub 消息顺序无法保证?

ruby-on-rails - 如何根据散列中的 id 对 ruby​​ 数组进行分组

ruby-on-rails - Rails 中脚手架的用例有哪些?什么时候该用,什么时候不用?