查看使用Unicorn处理的重复请求

时间:2014-03-12 00:01:06

标签: ruby-on-rails amazon-ec2 unicorn

最近我将EC2实例升级到c3.large,以便增加更多的独角兽工作人员来处理我们网站的流量增加。 (每台机器6个工人 - 2个ec2实例)。

当我这样做时,我开始看到正在创建重复记录!看起来不知何故,也许有2名独角兽工人正试图处理同样的请求?

在我的nginx日志中,我看到对特定rails控制器的ONE [POST]请求 - 但是在数据库中正在创建两条记录。显然我正在遇到某种竞争条件问题 - 但不知道如何调试这个问题。它不会一直发生,但是当它发生时它也会令人沮丧。我还注意到两个数据库记录彼此在5秒内。 (是的,当用户点击提交按钮时,我会禁用该按钮。)

Unicorn 4.8.2 Ruby 1.9.3 Rails 3.2.14

任何帮助都会很棒!谢谢!

1 个答案:

答案 0 :(得分:0)

虽然它可能无法解决您的问题,但请升级到Ruby 2.0.0。有些博客提到如果你使用Unicorn,升级到Ruby 2.0.0是一个好主意。

例如:https://www.digitalocean.com/community/articles/how-to-optimize-unicorn-workers-in-a-ruby-on-rails-app

具体来说:

  

如果您使用的是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。