首页 > 解决方案 > Play 框架如何跟踪被阻塞的客户端并返回响应

问题描述

问题是关于 Play 框架的,尽管概念是通用的。我猜想被阻塞的客户端正在侦听一个在服务器端跟踪并与 Future[Result] 一起传递的套接字,以便在 Future 完成时,将响应写入套接字,然后关闭套接字。

有人可以用参考资料分享更具体的解释吗?

引用自:

https://www.playframework.com/documentation/2.6.18/ScalaAsync

Web 客户端在等待响应时会被阻塞,但服务器上不会阻塞任何东西,服务器资源可以用于服务其他客户端。

标签: scalatcpplayframeworkblocking

解决方案


  1. 请注意,Play 不管理如何寻址客户端。这是由TCP管理的。基本上(作为一个简单的类比),您可以将客户端(如 Web 浏览器)视为向服务器拨打电话。当客户端发出请求时,其中一个套接字会连接到服务器上的特定套接字 - 这是请求/响应期间套接字之间的持久连接。Play 的底层服务器(旧版本的 Netty 或 v2.6+ 的 Akka Http)将接受来自套接字的传入请求并为其分配一个线程。Play 将完成工作,生成的响应将被服务器映射回正确的套接字。TCP 服务器将管理响应和套接字之间的映射,而不是 Play。

  2. 正如其他人所指出的,对阻塞的引用本质上与 Play Action 的工作方式(非阻塞)有关。他们接受请求,将您在 a 中编码的任何工作包装起来Future,然后将其交给在不久的将来某个时候完成(它可能是完成 Future 的不同线程,或者它甚至可能最终成为同一个线程)。关键是 Future 的创建速度很快,因此处理请求的线程会很快返回到池中,这样它就可以接收另一个请求来处理。如果您听说过反应式编程,那么这本质上就是保持应用程序响应式的想法。

    Web 客户端在等待响应时会被阻塞,但服务器上不会阻塞任何东西,服务器资源可以用于服务其他客户端。

    因此,客户端可能会在等待响应通过其套接字返回时被阻塞(除非它也在进行异步调用),但其想法是处理 Play 中的请求的线程池不会被阻塞,因为他们创建 Future 并将其完成交还给 Play 的方式,以便他们可以回去处理其他请求。

它还有更多内容,但希望这可以为 Play 文档中的特定声明提供更多背景信息。


推荐阅读