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

时间:2016-03-24 22:49:37

标签: ruby-on-rails mongodb 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'

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

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

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

2 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:6)

而不是调整wait_queue_timeout用于:

  

连接池[...] [1]

中等待的时间(以秒为单位)

我建议调整min_pool_sizemax_pool_size

  

连接池[1]

中的最小/最大连接数

所以你的服务器/后台工作者不必等待连接。

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

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