Nat*_*ate 6 mysql ruby-on-rails nginx
所以,我正在调查我们的Rails/Unicorn/Nginx应用程序上的MySQL死锁异常.我发现有时,我们会看到一个请求风暴,从一个客户端获取499状态代码.从这篇文章看,当客户端意外关闭连接时,或者嗯,某些东西,nginx看起来像是返回499.我不清楚客户端是否真正看到状态代码; 我不能在本地复制这个.
从nginx日志看起来,在这些请求中,我们最终将0字节写入客户端.在我的Rails日志中,请求没什么了不起的; 他们在正常的时间(40-120毫秒)内完成并返回302重定向.
所以,无论如何,对吧?但!造成这种情况的原因在于,客户似乎正在将其看到(或未看到)的内容解释为再次尝试其请求的邀请.即使它是一个POST.我的Rails应用程序很乐意处理这些请求并在数据库中创建重复的条目.有时它会创建相当多的记录 - 在一种情况下,我们让客户在大约十分钟内重复请求约6500次.这是......次优.
我正在试图弄清楚要做什么.我真正喜欢的是修复我用nginx看到的任何交互,但我不确定如何 - 如果客户端在获取数据之前关闭连接,我无法控制它将要做什么.
另一种选择(感觉就像一个可怕的黑客攻击)是做一些事情,比如在隐藏的表单中包含一个唯一的键(例如,来自序列),并在相应的数据库列上有一个唯一的索引.但是这个桌子上有数百万行,所以用它的模式搞砸不是我想做的事情.
如果重要,请求通过HTTPS完成.看起来它最常见于我们客户的一小部分.
还有其他人看过这个(除了这篇文章)吗?我完全疯了吗?谁能想到一个优雅的解决方案?
| 归档时间: |
|
| 查看次数: |
1717 次 |
| 最近记录: |