我在瘦线上使用多线程运行Rails应用程序。有一堆轮询请求,有时,当并发运行集成测试时,我有大约1-2%的丢失闪存故障。在我的production.log
中,如果失败,我会有以下内容:
I, [2017-08-21T23:31:51.280455 #2146] INFO -- : Redirected to http://192.168.102.1/projects/599bcfd4875aa40862863a5b
I, [2017-08-21T23:31:51.282501 #2146] INFO -- : Rendered text template (0.1ms)
I, [2017-08-21T23:31:51.283151 #2146] INFO -- : Completed 200 OK in 3062ms (Views: 1.4ms)
I, [2017-08-21T23:31:51.309004 #23906] INFO -- : Rendered projects/_tests_block.html.haml (24.0ms)
I, [2017-08-21T23:31:51.309392 #23906] INFO -- : Rendered projects/show.js.haml within layouts/application (29.9ms)
I, [2017-08-21T23:31:51.318025 #23906] INFO -- : Completed 200 OK in 124ms (Views: 48.4ms)
I, [2017-08-21T23:31:51.318956 #2146] INFO -- : Started GET "/projects/599bcfd4875aa40862863a5b" for 192.168.102.2 at 2017-08-21 23:31:51 -0700
I, [2017-08-21T23:31:51.321849 #2146] INFO -- : Processing by ProjectsController#show as HTML
I, [2017-08-21T23:31:51.321994 #2146] INFO -- : Parameters: {"id"=>"599bcfd4875aa40862863a5b"}
我的重定向呼叫看起来像redirect_to @project, notice: success_message
在重定向和开始获取显示页面之间,我从另一页面完成了轮询请求。在这种情况下,当呈现显示页面时,没有flash[:notice]
。
我试图明确地保留并清除Flash,因此ApplicationController中有before_filter { flash.keep }
,而我的通知部分中有flash.clear
。
我还尝试在每次操作之前记录闪烁,并且在此并发情况下没有其他操作窃取闪存,它只是缺失。
这是多线程问题吗?或者也许我应该使用或实现具有“目的地”的闪存?所以这也应该是线程安全的。
PS Ruby 2.3.4,Rails 4.2.7,Thin 1.5.1