2014-12-22 24 views
0

我的Rails 4.1.4应用程序在多个Puma实例上运行,我有一个奇怪的问题。该应用程序有一个由SOA架构中的其他系统触发的API。我们有一个高流量的系统,它接到很多电话。如果在启动应用程序时,我们有客户致电我们的端点(称为轨道)中的一个,那么它看起来像一些彪马工人的不正常加载类到内存中,我们开始喜欢把自己的错误:在应用程序启动时ActionNotFound

FATAL -- : 
AbstractController::ActionNotFound (The action 'track' could not be found for ArticlesController): 
    vendor/bundle/ruby/1.9.1/gems/actionpack-4.1.4/lib/abstract_controller/base.rb:131:in `process' 
    vendor/bundle/ruby/1.9.1/gems/actionview-4.1.4/lib/action_view/rendering.rb:30:in `process' 

和...

FATAL -- : 
AbstractController::ActionNotFound (The action 'find' could not be found for MatchesController): 
    vendor/bundle/ruby/1.9.1/gems/actionpack-4.1.4/lib/abstract_controller/base.rb:131:in `process' 
    vendor/bundle/ruby/1.9.1/gems/actionview-4.1.4/lib/action_view/rendering.rb:30:in `process' 

注意,跟踪事件仅在ArticlesController,但事情正在发生的地方,一旦我们进入这种情况,不能作出对任何控制器的请求。

如果我禁用来自客户端的跟踪端点的呼叫,并且我弹出我的应用程序,则一切正常。如果我等到系统启动并再次打开跟踪调用,则一切仍然正常。

只有在应用程序启动时音轨调用正在进行时,才会出现此问题。

我不知道提供哪些信息来帮助诊断此问题。如果有人对如何进行调试有什么预感,我会给这个问题添加更多细节。

+1

只是一个预感,也许尝试着急加载你的控制器:http://blog.plataformatec.com.br/2012/08/eager-loading-for-greater-good/ – DiegoSalazar

回答

0

我不确定底层问题是什么,但它似乎与应用程序引导过程中缺乏线程安全性有关。避免这些错误的bandaid解决方案是将Puma配置为每个工作者使用1个线程。

这里是我的配置/ puma.rb的内容:

之前

... 
threads 1,2 
workers 6 
preload_app! 

后 -

... 
threads 1,1 
workers 12 
preload_app! 

这工作,但不幸的是,它有点失去了使用的目的支持线程的服务器。