我在多个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 调用时才会出现此问题。
我不知道提供哪些信息来帮助诊断此问题。如果有人对预测如何进行调试,我会在问题中添加更多细节。
答案 0 :(得分:0)
我不确定底层问题是什么,但它似乎与应用程序启动过程中缺乏线程安全性有关。避免这些错误的bandaid解决方案是将Puma配置为每个worker使用1个线程。
以下是我的config / puma.rb的内容:
之前
...
threads 1,2
workers 6
preload_app!
之后 -
...
threads 1,1
workers 12
preload_app!
这很有效,但不幸的是,它有点挫败了使用支持线程的服务器的目的。