【问题标题】:ActionNotFound during application boot应用程序启动期间的 ActionNotFound
【发布时间】:2014-12-24 06:32:35
【问题描述】:

我的 Rails 4.1.4 应用程序在多个 Puma 实例上运行时遇到一个奇怪的问题。该应用程序有一个被 SOA 架构中的其他系统访问的 API。我们有一个高流量的系统,它会接到很多电话。如果在启动应用程序时,我们有客户端调用我们的端点之一(称为 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 调用时才会出现此问题。

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

【问题讨论】:

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


【解决方案1】:

我不确定根本问题是什么,但这似乎与应用程序引导期间缺乏线程安全有关。避免这些错误的创可贴解决方案是将 Puma 配置为每个工作人员使用 1 个线程。

这是我的 config/puma.rb 的内容:

之前

...
threads 1,2
workers 6
preload_app!

之后 -

...
threads 1,1
workers 12
preload_app!

这可行,但不幸的是,它有点违背了使用支持线程的服务器的目的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多