Rails + Nginx:HTTP 499错误和客户端重复POST

时间:2013-11-05 17:33:39

标签: mysql ruby-on-rails nginx

所以,我正在调查我们的Rails / Unicorn / Nginx应用程序上的MySQL死锁异常。我发现有时,我们会看到一个请求风暴,从一个客户端获取499状态代码。从this post开始,当客户端意外关闭连接或者某些东西时,nginx看起来像是返回499。我不清楚客户端是否真正看到状态代码;我不能在本地复制这个。

从nginx日志看起来,在这些请求中,我们最终会向客户端写入0个字节。在我的Rails日志中,请求没什么了不起的;它们在正常的时间内完成(40-120毫秒)并返回302重定向。

所以,无论如何,对吧?但!造成这种情况的原因在于,客户似乎正在将其看到(或未看到)的内容解释为再次尝试其请求的邀请。即使它是一个POST。我的Rails应用程序很乐意处理这些请求并在数据库中创建重复的条目。有时它会创建相当多的记录 - 在一种情况下,我们让客户在大约十分钟内重复请求约6500次。那是......次优。

我正在试图弄清楚要做什么。我真正喜欢的是修复我用nginx看到的任何交互,但我不确定如何 - 如果客户端在获取数据之前关闭连接,我无法控制它将要做什么。

另一种选择(感觉就像一个可怕的黑客攻击)是在隐藏的表单中执行类似包含唯一键(例如,来自sequence)并在相应数据库列上具有唯一索引的操作。但是这个桌子上有数百万行,所以搞砸了它的架构并不是我想做的事情。

如果重要,请求通过HTTPS完成。它看起来最常见于我们客户的一小部分。

还有其他人看过这个(this post除外)吗?我完全疯了吗?有人能想到一个优雅的解决方案吗?

0 个答案:

没有答案