如何处理 rails/mongoid 中的出队连接超时?

How do I deal with dequeue connection timeouts in rails/mongoid?

我的堆栈:RoR4.2.6,Mongoid 5.0.1

我正在使用 apache 基准测试我的网站并不断遇到如下错误:

2016-03-24 22:15:36 +0000 pid=23187, severity=FATAL, 
ActionView::Template::Error (Timed out attempting to dequeue connection after 1 sec.):
    22:   =link_to '/albums/' + mention.object.slug do
    23:     .small-12.medium-6.large-4.columns.left
    24:       .mention-box
    25:         %img.mention-thumb{src: mention.object.thumb_url}
    26:         %h5.mention-name
    27:           = mention.object.name
    28:           %br
  app/models/mention.rb:13:in `object'
  app/views/posts/_full_mention.html.haml:25:in `block in _app_views_posts__full_mention_html_haml___1744802549767261808_47000690052420'

仅供参考,这是在 mention.rb 中调用的行,只是一个简单的查找查询:

  def object
    Object.const_get(type).find(mention_id)
  end

我的假设是,这意味着我遇到了 mongoDB 太多的请求,它无法跟上,但不完全确定如何解决这个问题。我应该为 mongoid 设置更高的队列超时吗?感谢任何建议!

有同样的问题, 通过在 mongoid.yml 生产配置中添加 wait_queue_timeout 属性解决:

production:
  clients:
    default:
     uri:  mongodb://xxx.com:27017/mongo
     options:
       connect_timeout: 15
       wait_queue_timeout: 15

而不是调整 wait_queue_timeout 是为了:

The time to wait, in seconds, in the connection pool for a connection [..] [1]

我建议调整 min_pool_sizemax_pool_size

The minimum/maximum number of connections in the connection pool [1]

因此您的 server/background 工作人员不必等待连接。

如果您运行您的应用程序使用多线程应用程序服务器 (Puma) 或在 Sidekiq 内部,您需要设置适当大小的连接池。

[1] https://docs.mongodb.com/ecosystem/tutorial/mongoid-installation/