在评估不同的服务器解决方案时,我需要了解 Play2 在使用 Iteratees 时如何处理并发,尤其是在处理 Websockets 请求时。
如果您查看此代码,显示具有共享状态的简单 websocket 服务器(协作绘画应用程序)https://github.com/gre/playpainter/blob/master/scala/app/controllers/Application.scala
您将看到每个 websocket 请求都可能修改共享状态,例如画家映射或连接计数器。这个代码线程安全吗?如果是(作者确认) Play2 内部如何处理并发?在这一点上,不幸的是,我没有 Scala 水平来完全理解 play2 lib 代码。
我想知道他们如何以高性能(可以“同时”处理多个请求)来调和线程安全(一次只能由一个线程修改映射或计数器)。
我能想到的唯一可行的行为是将每个迭代块的处理包装在自己的线程事务中;最终会严重限制并发性(尽管简化了用户代码)并最终获得类似于 Node.js 或任何单线程服务器将提供的性能?我可以看到 Iteratee 编程模型在流式传输、文件处理等方面的好处,但对于每个请求都会触发非琐碎工作(服务器计算、数据库访问等)的 websocket 来说并没有那么多好处