2010-11-17 113 views
7

我需要構建非常併發的Web服務,它將爲JavaScript(前端)和Rails(後端)公開基於REST的API。 Web服務將適用於MongoDB的數據訪問API。基於演員的Web框架可用於Scala嗎?

我已經寫了一個使用NodeJS的初始實現,並且想嘗試基於Scala的解決方案。我也在考慮Erlang,每個Web框架都是基於actor的。

所以我正在尋找使用Actors顯式構建的Web框架以支持大量的請求我對Scala很陌生,我不太瞭解Actor如果幾乎所有的Scala框架都基於在每個請求上創建一個線程的Java servlet,這些線程將耗盡我場景中的所有資源。

+0

這是一個老問題,但你應該看看播放2.0將在網狀運行和阿卡使用。 – 2011-11-17 15:36:21

回答

3
  1. 如果你真的要具有10K +長活動連接的時間,那麼任何標準的Java應用服務器/框架(也許,除了Netty中)將不會爲你工作 - 所有這些都消耗大量的的內存(即使使用任何種類的智能NIO)。你最好堅持一個基於集羣的基於事件循環的解決方案(比如你已經嘗試過的node.js),用zeroMQ支持的雜種,用於寫入由Scala Actors調查的MQ模式的nginx等。

  2. 在Scala/Java框架中,Lift對REST具有良好的異步支持(儘管它不直接與演員綁定)。 OTOH,LinkedIn將Scalatra + stdlib actors用於Signal背後的REST服務,感覺很好。

+0

謝謝,連接不會很長,但它們大概10k左右很容易。我試圖理解Lift是如何工作的,我不喜歡他們想要讓所有其他地方都有會話。由於其簡單性,Sinatra/ExpressJS/Scalatra更適合我。你提到LinkedIn如何使用Scalatra - 但他們表示'Scalatra不使用任何演員',這很可惜。 – sha1dy 2010-11-18 12:39:00

+0

1. Lift CometActors和異步REST與會話無關(兩者趨於無狀態)。 2. Scalatra沒有像Lift那樣使用演員(例如CometActor)並沒有阻止任何人使用演員與我認識的+一起使用,Scalatra開發人員正在致力於COMET的支持 – 2010-11-18 12:49:04

+0

感謝您解釋如何電梯工程。關於Scalatra的和演員 - 將Scalatra的重負載下的死,因爲它會創建新的線程爲每一個請求,因爲它默認實現擴展非標準的java類(似乎github.com不是在這個世界的一部分迴應,所以我可以看一下班Scalatra延伸)? – sha1dy 2010-11-18 13:20:13

0

http://liftweb.net/事實上,一個請求從一個servlet開始,然後lift使用在許多servlet容器中發現的comet支持脫離線程,保持請求上下文(容器不會銷燬),然後可以用於在演員中輸出數據。

http://akkasource.org也有休息的支持,但直到演員與工作

+0

Scala有什麼升降機?我喜歡西納特拉(或ExpressJS)和我很退出知道西納特拉(Scalatra的)的端口也存在斯卡拉,但似乎它並沒有使用演員 – sha1dy 2010-11-17 21:00:54

+0

嗯,如前所述,阿卡具有REST和演員。它通過整合氣氛圖書館來支持進行中的彗星支持。對於我的使用情況下,氣氛不好(我能弄清楚是如何用它做聊天般的服務,而不是「開始」 - >「重生演員」 - >「完成」循環) – IttayD 2010-11-17 21:11:38

+1

阿卡有彗星模塊正在進行代號akka-mist可能會做你需要的東西 - >接受傳入的請求,將其派發給演員,讓演員異步完成請求。 – 2010-11-19 18:53:33

1

另一種選擇是Play framework完成它會阻塞線程。最新的1.1版本支持Scala。它也支持akka作爲模塊。

+0

我相信Play 2.0的新版本會通過AKK來支持演員,並且會使用netty。 – 2011-11-17 15:34:20

1

至於Scalatra的本身,他們一直在努力呼籲SSGI(類似於在Servlet /架/ WSGI/WAI層)的新要求0​​抽象, ,他們說應該ennable他們從單純突破作爲 Servlet運行,並且也運行在使用Netty構建的東西之上。見線程herehttp://github.com/scalatra/ssgi

有因爲從底層設計爲支持異步Web服務(不會佔用每個請求的線程),在簡單的Scalatra的級別其他一些有趣的框架:

https://github.com/jdegoes/blueeyes - 不是一個servlet;建在Netty上。 (「鬆散的靈感來自... Scalatra」)

http://spray.cc/ - 基於Akka演員,Akka Mist。的Servlet 3.0或碼頭延續 (「噴霧在很大程度上受到BlueEyes和Scalatra的啓發。」)

而在較低的水平: https://github.com/rschildmeijer/loft - 「繼續基於無阻塞,異步,單線程網絡 服務器」。 沒有生產準備,但看起來很有趣。繼續需要編譯器插件。