最近我将EC2实例升级到c3.large,以便增加更多的独角兽工作人员来处理我们网站的流量增加。 (每台机器6个工人 - 2个ec2实例)。
当我这样做时,我开始看到正在创建重复记录!看起来不知何故,也许有2名独角兽工人正试图处理同样的请求?
在我的nginx日志中,我看到对特定rails控制器的ONE [POST]请求 - 但是在数据库中正在创建两条记录。显然我正在遇到某种竞争条件问题 - 但不知道如何调试这个问题。它不会一直发生,但是当它发生时它也会令人沮丧。我还注意到两个数据库记录彼此在5秒内。 (是的,当用户点击提交按钮时,我会禁用该按钮。)
Unicorn 4.8.2 Ruby 1.9.3 Rails 3.2.14
任何帮助都会很棒!谢谢!
答案 0 :(得分:0)
虽然它可能无法解决您的问题,但请升级到Ruby 2.0.0。有些博客提到如果你使用Unicorn,升级到Ruby 2.0.0是一个好主意。
具体来说:
如果您使用的是Ruby 1.9,那么您应该认真考虑 切换到Ruby 2.0。要理解为什么,我们需要了解一个 关于分叉的一点点。
分叉和写时复制(CoW)
当分叉子进程时,它是 与父进程完全相同的副本。但是,实际 无需复制物理内存。因为它们是精确的副本, 子进程和父进程可以共享相同的物理内存。 只有在写入时 - 然后我们将子进程复制到 物理记忆。
那么这与Ruby 1.9 / 2.0和Unicorn有什么关系?
回想一下Unicorn使用分叉。从理论上讲,操作系统会 能够利用CoW。不幸的是,Ruby 1.9没有 让这成为可能。更准确地说,垃圾收集 Ruby 1.9的实现并不能实现这一点。非常 简化版是这个 - 当Ruby 1.9的垃圾收集器 踢了之后,就会写出一个写入,从而使CoW变得毫无用处。
没有太多的细节,只要说出来就足够了 Ruby 2.0的垃圾收集器修复了这个问题,我们现在可以利用CoW。