评估不同的服务器解决方案,我需要了解Play2在使用Iteratees时如何处理并发性,特别是在处理Websockets请求时。
如果您查看此代码,显示一个具有共享状态的简单websocket服务器(协作绘制应用程序)https://github.com/gre/playpainter/blob/master/scala/app/controllers/Application.scala
您将看到每个websocket请求都可能修改共享状态,例如画家地图或连接计数器。这段代码线程安全吗?如果是(作者确认),Play2内部如何处理并发?此时,我没有让Scala级别完全理解play2 lib代码。
我想知道他们如何能够以高性能协调线程安全(地图或计数器一次只能由一个线程修改)(多个请求可以“同时”处理。
我能想到的唯一可行的行为是将每个iteratee块的处理包装在自己的线程事务中;最终严重限制了并发性(尽管简化了用户代码)并最终获得了类似于Node.js或任何单线程服务器所能提供的性能?我可以看到Iteratee编程模型对流式传输,文件处理等的好处,但对于每个请求触发非繁琐的工作(服务器计算,数据库访问等)的websockets而言都不是那么多
答案 0 :(得分:1)
我的应用程序的线程安全性错了,它有一个错误。
我刚刚使用ConcurrentHashMap修复它,请参阅更改https://github.com/gre/playpainter/commit/5120de5b77627836fe26602546f82c99a28cdf1b
感谢您的举报。