传统的WEB框架是基于Servlet标准设计实现的,加上Tomcat的出现,直接促成了JSP的崛起,然而时过境迁,Servlet已风光不在,Web容器存在的必要性也被越来越多的人质疑。原因就在于人为的将应用与容器剥离, 虽然这种做法本意是好的,但是结果就是给开发测试部署带来一系列集成的问题,SPRING BOOT的快速流行就是一个现实的例子,越来越多的项目开始使用内嵌的Jetty或Tomcat就是一个现实的例子。
Servlet还带来一个问题,就是有状态的服务器。一旦使用了Session,服务器就无法享受到水平扩展的好处了,由此不得不采用Session复制或者粘性Session(Sticky Session)的 方案来解决这个问题,无论采取哪种方案都会有性能损耗,并且推高了技术成本。
Play抛弃了Servlet/JSP里Session等概念, 内置没有提供方法将对象与服务器实例进行绑定(你要使用HashMap存的话Play也没办法)。 推荐的做法是使用外部缓存, 比如Redis, Memcached等。可能有人会觉得没有Session是Play的一个缺点(Play里的Session和Servlet Session不是一回事), 但是只要你开发过流量大一点的应用, 你就会理解这点。
Play是基于Netty实现的异步的请求响应接口(Request/Result),消息驱动的框架。请求只有在有事情做的时候才会占用线程资源,不会出现一个线程长时间等待某操作完成或超时的时况。