0

在视频控制器 - 显示动作中,我尝试了两种情况。第一个使用increment_counter, 并直接写入数据库:

Video.increment_counter(:views_count, @video.id)

第二种方法使用该save方法。

@video.views_count = @video.views_count + 1
@video.save

在 ApacheBench 中,我这样做:

ab -n 100 -c 10 http://127.0.0.1:3000vidoes/18

视频 ID 为 18。我确保views_count在每次运行时通过Video.find(18).update_attribute(:views_count, 18).

在两种情况下运行 ApacheBench 后,views_count都保持在 100。我想increment_countersave方法更准确,因为它直接写入数据库。

我的卧推正确吗?

4

1 回答 1

1

使用这两种方法都得到正确答案的原因是您并没有真正在这里测试并行性。当 apachebench 触发 10 个并发请求时,您的 rails 服务器一次只处理其中一个。尝试以下方法之一来利用第二种情况中存在的竞争条件:

  • 启动多个 Rails 服务器并将它们放在负载均衡器后面。您可以使用乘客来执行此操作,或者使用类似的东西thin -s 4,然后将所有这些服务器放在 nginx 或 haproxy 实例后面。
  • 切换到使用避免 GIL 的线程解决方案,例如在 puma 下运行的 JRuby 或 rubinius
于 2012-08-14T05:18:20.427 回答