我正在创建连接关系数据库(Amazon RDS)的播放应用程序。
将对数据库进行查询的逻辑包装在Future
中以进行异步执行。
是否会为查询设置专用的执行上下文以使其与应用程序使用的上下文分开,从而带来性能提升?如果是,为什么?
是。在正常情况下,这是处理此类问题的首选方式。
默认情况下,Play用于处理请求的线程池的默认大小为计算机内核的数量。为了从Play用于处理请求的执行上下文中获得最佳性能,您的动作处理程序代码必须为:
无阻塞且计算速度快
这是因为任何阻塞操作或计算量大的调用都将花费更多时间来执行。一些阻塞请求阻塞了线程池,使没有线程可用于处理较新的请求。在更高的负载下情况会变得更糟,因为在这种情况下,您可能希望通过一些消息返回给用户,而不是用户等待太久才能获得结果(因为所有线程都在忙于处理先前的调用)。
让我们假设在4核计算机上,如果您的操作处理程序执行了阻止呼叫的操作(需要10秒钟来执行)。如果有4个以上的并发http请求,则即使计算机在计算上未得到充分利用,服务器也将无法处理新请求(直到之前的4个被执行)。理想情况下,服务器可以承担更多的负载。
因此,应该以特定方式编写动作处理程序代码,以充分发挥最佳性能。
让我们假设您使用Play为其请求处理线程池使用的相同执行上下文,以用于db调用。一些昂贵的数据库调用会阻塞执行上下文,从而使没有线程可用于处理请求。