应用程序启动期间的ActionNotFound

时间:2014-12-22 22:18:35

标签: ruby-on-rails ruby-on-rails-4 puma

我在多个Puma实例上运行的Rails 4.1.4应用程序有一个奇怪的问题。该应用程序的API受到SOA架构中其他系统的攻击。我们有一个高流量系统,它接收很多电话。如果,在启动应用程序时,我们有客户端调用我们的一个端点(称为 track ),那么似乎有些Puma工作人员没有正确地将类加载到内存中我们开始获得错误如:

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'

请注意,track事件仅在ArticlesController上发生,但是一旦我们遇到这种情况,它就会发生在它可以对任何控制器发出请求的地方。

如果我从客户端禁用对 track 端点的调用并且我退回了我的应用程序,那么一切正常。如果我等到系统启动并再次打开 track 电话,那么一切都还可以。

只有在应用程序启动期间进行 track 调用时才会出现此问题。

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

1 个答案:

答案 0 :(得分:0)

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

以下是我的config / puma.rb的内容:

之前

...
threads 1,2
workers 6
preload_app!

之后 -

...
threads 1,1
workers 12
preload_app!

这很有效,但不幸的是,它有点挫败了使用支持线程的服务器的目的。