Play 框架如何跟踪被阻止的客户端和 returns 响应

How does Play framework track the blocked client and returns the response

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

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

引用自:

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

The web client will be blocked while waiting for the response, but nothing will be blocked on the server, and server resources can be used to serve other clients.

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

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

    The web client will be blocked while waiting for the response, but nothing will be blocked on the server, and server resources can be used to serve other clients.

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

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