Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在rails中同时处理数百个请求_Php_Ruby On Rails_Ruby_Apache_Phusion - Fatal编程技术网

Php 在rails中同时处理数百个请求

Php 在rails中同时处理数百个请求,php,ruby-on-rails,ruby,apache,phusion,Php,Ruby On Rails,Ruby,Apache,Phusion,我正在编写一个RubyonRails应用程序,该网站最重要的功能之一就是现场投票。我们完全希望在1分钟内收到10万个投票请求。与其他请求一起,这意味着我们可能会收到大量请求 我最初的想法是将服务器设置为使用apache+phusion,但是,为了投票,我正在考虑编写一个php脚本,并在memcached中写入/读取信息。数据只需要保持15分钟左右,因此在1分钟内写入数据库10000次似乎毫无意义。我们还需要标记用户的ip,这样他们就不会进行两次投票,因此在memcached中会更加复杂 如果任何

我正在编写一个RubyonRails应用程序,该网站最重要的功能之一就是现场投票。我们完全希望在1分钟内收到10万个投票请求。与其他请求一起,这意味着我们可能会收到大量请求

我最初的想法是将服务器设置为使用apache+phusion,但是,为了投票,我正在考虑编写一个php脚本,并在memcached中写入/读取信息。数据只需要保持15分钟左右,因此在1分钟内写入数据库10000次似乎毫无意义。我们还需要标记用户的ip,这样他们就不会进行两次投票,因此在memcached中会更加复杂


如果任何人有任何建议或想法,使这项工作尽可能最好,请帮助

如果你要为这种大规模涌入设计一个应用程序,你需要将它的基本组件剥离到绝对最小

使用一个完整的Rails堆栈来达到这样的强度并不实际,也没有必要。最好构建一个非常薄的机架层,通过直接DB调用来处理投票,甚至跳过ORM,基本上是
INSERT
语句的包装器。这是Sinatra和Sequel作为一个高效的查询生成器可能会有所帮助的

您还应该确保正确地调优数据库,并对其运行许多负载测试,以确保其按预期执行,并为更高的负载提供良好的裕度

在一分钟内进行10000 DB的调用并不是什么大问题,在经过适当调整的堆栈上,每次调用只需要几分之一毫秒。Memcached可以提供更高的性能,特别是如果结果不是永久性的。Memcached有一个原子增量操作符,这正是您在简单制表投票时所要寻找的。Redis也是一个非常有能力的临时商店

另一个想法是完全废弃数据库,编写一个使用简单的基于JSON的协议的持久化服务器进程。如果您致力于Ruby,Eventmachine非常适合将这些东西组合在一起,如果您愿意用JavaScript构建一个专门的tally服务器,NodeJS也是如此

即使在使用专用服务器进程的普通硬件上,也很容易在一分钟内完成10000个操作,而无需整个数据库堆栈的开销

您只需确保您的范围定义得非常好,以便在部署实现之前可以测试并严重滥用实现

由于您所描述的核心内容相当于哈希查找,因此基本代码如下:

contest = @contest[contest_id]

unless (contest[:voted][ip])
  contest[:voted][ip] = true
  contest[:votes][entry_id] += 1
end

在一秒钟内运行这个数十万次是完全可行的,因此唯一的开销就是在它周围包装一个JSON层。

看看NoSQL dbs,每分钟10k写入大约是每秒165次写入。不多。我没想到,你推荐的最可靠的是什么?NoSQL的MongoDB。如果您使用的是MySQL,请使用MyISAM表。查看本文。如果您决定使用基于机架的框架(Rails,Sinatra),请不要使用Apache+Passenger,首先是因为Apache占用大量内存和CPU,其次是因为它占用大量内存和CPU:p,checkout Nginx,它可以很容易地与Passenger一起编译,或者代理Unicorn之类的东西。它也有一个可笑的小内存占用低于2MB。感谢您的伟大回应。我可能会测试eventmachine,Sinatra+memcached似乎真的很有效,而且不需要太多额外的编码工作。问题是,这是一个单一的功能,然而,这是一个如此高的要求,它需要它自己的解决方案。