在视频控制器中 - 显示操作,我尝试了两种方案。第一个使用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
在每次ab运行时重置Video.find(18).update_attribute(:views_count, 18)
。
在两种情况下运行ApacheBench之后,views_count
在100处保持一致。我会想象increment_counter
比save
方法更准确,因为它直接写入数据库。 / p>
我正确地坐着吗?
答案 0 :(得分:1)
您使用这两种方法得到正确答案的原因是您并未在此处测试并行性。虽然apachebench启动了10个并发请求,但您的rails服务器一次只处理其中一个请求。尝试以下方法之一来利用第二种情况中出现的竞争条件:
thin -s 4
之类的方式执行此操作,然后将所有这些服务器放在nginx或haproxy实例后面。