Posted on 2010-02-20 04:42
leekiang 阅读(358)
评论(0) 编辑 收藏 所属分类:
ruby
另一个常见的问题是当应用软件要执行一个需时长的请求时,处理不当。如果实现得不好,会让处理这个web请求的handler很长时间没有反应。
这个问题是在人机界面方面很普遍,而且也有一个普遍的解决方法 -- 把任务交给一个背景运行的过程或线程。任何开发过桌面应用的人都会觉得很熟悉。但是有时候如果开发者把切换和通信做得不好,也会碰到麻烦。
一个我觉得较好的办法,而幸好我的ThoughtWorks同事们也同意,就是使用一个actor。在这个模型里,web请求的handler把需时长的请求包装为一个命令(command),然后放进队列(queue)内。在背景运行的actor就监察着这个queue,从queue中提出并且执行这个命令。当它把这个命令执行完了,就通知前台界面的actor。通常这个queue一开始会是数据库的一个表,之后如有需要的话,再把它改为一个消息队列(message queue)。
和ActiveRecord的漏洞一样,我提起这个不是因为它是Rails里特有的问题;我们在各种应用也会看到同样的问题。值得在这里带出是因为用Rails的人们往往很容易忘了有这样的情况发生,也忘了有这样的模式去解决。我们发现Rails把web开发中重复又重复的环节变得简易和快,但是复杂的环节是仍然存在的。
来源:http://rickylui.com/lionwiki/index.php?page=Ruby+at+ThoughtWorks
http://martinfowler.com/articles/rubyAtThoughtWorks.html