Re: [問題] Rails handle multiple requests
※ 引述《lintingy (4/9 熱舞成發在新體! 4/9)》之銘言:
: 環境:
: Ruby 1.8.7
: Rails 3.0.7
: 狀況:
[...]
大哉問 XD
: 1. rails default使用single thread的原因是什麼?
: 要能夠讓很多使用者同時使用網站但卻用single thread,這不會很矛盾嗎?
這個問題有很多很多的層面,以我個人主觀的說法是,rails 打從一開始就沒寫好,
不是個 thread-safe 的 framework. concurrency 的作法有很多種,threaded 只是
其中一種。另外大致上分成 multi-process (fork) 和 event-driven (evented).
最早 rails 是走 multi-process 的路,不管是用 fast-cgi 或 mongrel.
這種作法的優點是,程式很好寫,因為根本就不用去管 thread-safety, 也就是
可以大量使用有 state 有 side-effect 的暴力寫法。對不太擅長寫程式的人而言,
這也是最簡單的作法。
後來 rails 終於變成 thread-safe 了,但預設還是會做 lock, 我沒記錯的話。
因為大部份的 rails application 仍然不是 thread-safe, 跑 multi-thread 還是
會爛掉。
至於如果你想用 evented-rails 或 threaded-rails, 主要要注意的是 server
本身得支援才行。而這兩種作法,都得保證你自己的程式也是 thread-safe 或
async-safe 等等,有很多技術細節要討論。
: 2. 丟到background去處理,跟想辦法讓rails server變成multithread,
: 這兩種方式有哪一種會比較建議嗎?
這兩個解決的問題是不同的。丟到 background 處理,server 得先回應 client.
反之如果是 threaded 或 evented, server 可以等到有結果後才回應 client.
因此問題是,能不能先回應 client?
如果這不是個重要的問題的話,我會建議先走 background (worker),
因為這種作法比較單純簡單,而且以後總是用得到。
不過不管怎麼樣,這兩種作法並不是互斥,能走 threaded 或 evented 還是比較好。
(技術難度也高很多)
: 3. 那如果用background執行的方式,要怎麼樣知道他已經處理完了?
: (因為處理完後要馬上給使用者feedback)
: (而之前有用過fork處理類似問題,
: 但是這麼一來就沒有辦法知道他已經處理完了,
: 後續的顯示就不知道該怎麼接上...)
fork 應該還是能知道他處理完了,不過在這邊用 fork 應該不太對...
總而言之,這邊會變成兩種作法... 也就是常見的 poll 或 push 了。
只是要能動的話,可以先找各種 poll 的方法,效能不佳的話再看 push,
再不行再試 threaded 或 evented, 因為這難度最高,所以最後試...
: 4. 最後則是說,如果要實做rails server的multithread,
: 有沒有建議的方式?
rails 裡有個 config.threadsafe! 要打開,然後 server 本身也要跑 thread,
比方說 Rainbows! 的各種 thread model:
http://rainbows.rubyforge.org/
ThreadPool for 1.9: http://rainbows.rubyforge.org/Rainbows/ThreadPool.html
ThreadSpawn for 1.8: http://rainbows.rubyforge.org/Rainbows/ThreadSpawn.html
不好意思的是,我自己是沒玩過,之前試 async rails 碰了一堆壁,
rails 自己有一些奇怪的 lock, 所以就不想在 rails 上試這些了...
可能 rails 3 有改善吧,不知道
: 抱歉,第一次問問題就問了一大堆,也還希望有人可以協助解答,
: 感謝非常!!!!!!!!
--
In Lisp, you don't just write your program down toward the language,
you also build the language up toward your program.
《Programming Bottom-Up》- Paul Graham 1993
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.25.229.250
→
08/03 12:39, , 1F
08/03 12:39, 1F
→
08/03 12:40, , 2F
08/03 12:40, 2F
討論串 (同標題文章)
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章