红宝石轨道循环导致服务器冻结
问题描述:
我正在研究Windows上的Ruby on Rails项目。我安装了Ruby 1.86和Rails 2.35。直到我试图实施彗星过程时,一切都很好。我编写了下面的代码来响应长查询JavaScript请求。但每次调用此函数时,它都会挂起整个导航服务器,直到超时,才会有第二个请求进入。 (我知道有juggernaut,但我喜欢首先自己实现一个:)红宝石轨道循环导致服务器冻结
这是由于我的服务器设置?该项目将部署在一个Ngix和Passenger的Linux服务器上,它会遭受同样的问题吗?
def comet_hook
timeout(5) do
while true do
key = 'station_' + station_id.to_s + '_message_lastwrite'
if Rails.cache.exist?(key)
@cache_time = DateTime.parse(Rails.cache.read(key))
if @cache_time > hook_start
@messages = @station.messages_posted_after(hook_start)
hook_start = @cache_time
break
end
end
end
...
end
使用Rails的内存存储高速缓存
而且,我不断收到“不能修改冻结的对象”的错误,所以上面的脚本只是工作的我,当我切换到文件缓存。 :(
答
你的Windows安装程序可能包含单个或webrick
例如mongrel
可同时处理只有一个连接。
Passeger和nginx
设置可以(并且通常会),当然,容纳多个并发会话通过网络服务器过程的集群(可以是背后nginx
一个mongrel
簇,或乘客的Apache工作进程的集群)中,如果被配置为这样做(mongrel
集群,MaxClients
为Apache /乘客的servers
配置值。)
根据预期的流量(例如,流量)来扩展并发客户端会话和/或系统内存的数量。如果您希望每秒处理10个请求(每个请求可能需要5秒或更长时间才能处理服务),则需要容纳50个或更多客户端连接,即群集中有50个或更多的Mongrel服务器或者50个或更多的Apache工作进程 - 不平凡的内存要求。)