scala - Play 框架如何跟踪被阻塞的客户端并返回响应
问题描述
问题是关于 Play 框架的,尽管概念是通用的。我猜想被阻塞的客户端正在侦听一个在服务器端跟踪并与 Future[Result] 一起传递的套接字,以便在 Future 完成时,将响应写入套接字,然后关闭套接字。
有人可以用参考资料分享更具体的解释吗?
引用自:
https://www.playframework.com/documentation/2.6.18/ScalaAsync
Web 客户端在等待响应时会被阻塞,但服务器上不会阻塞任何东西,服务器资源可以用于服务其他客户端。
解决方案
请注意,Play 不管理如何寻址客户端。这是由TCP管理的。基本上(作为一个简单的类比),您可以将客户端(如 Web 浏览器)视为向服务器拨打电话。当客户端发出请求时,其中一个套接字会连接到服务器上的特定套接字 - 这是请求/响应期间套接字之间的持久连接。Play 的底层服务器(旧版本的 Netty 或 v2.6+ 的 Akka Http)将接受来自套接字的传入请求并为其分配一个线程。Play 将完成工作,生成的响应将被服务器映射回正确的套接字。TCP 服务器将管理响应和套接字之间的映射,而不是 Play。
正如其他人所指出的,对阻塞的引用本质上与 Play Action 的工作方式(非阻塞)有关。他们接受请求,将您在 a 中编码的任何工作包装起来
Future
,然后将其交给在不久的将来某个时候完成(它可能是完成 Future 的不同线程,或者它甚至可能最终成为同一个线程)。关键是 Future 的创建速度很快,因此处理请求的线程会很快返回到池中,这样它就可以接收另一个请求来处理。如果您听说过反应式编程,那么这本质上就是保持应用程序响应式的想法。Web 客户端在等待响应时会被阻塞,但服务器上不会阻塞任何东西,服务器资源可以用于服务其他客户端。
因此,客户端可能会在等待响应通过其套接字返回时被阻塞(除非它也在进行异步调用),但其想法是处理 Play 中的请求的线程池不会被阻塞,因为他们创建 Future 并将其完成交还给 Play 的方式,以便他们可以回去处理其他请求。
它还有更多内容,但希望这可以为 Play 文档中的特定声明提供更多背景信息。
推荐阅读
- python - 在 PythonAnywhere 上升级 Python 3.8 后 Dash WSGI 文件出现问题
- java - 如何在 JAVA 中处理 ArrayList?
- angular - 错误类型错误:无法读取对象中不存在的属性“名称”
- amazon-web-services - AWS CodeDeploy“不允许跨账户传递角色”错误
- java - 无法在java中读取属性文件
- python - 使用 selenium 库创建 Instagram Bot
- java - Spring bean 在 Jersey ContainerRequestFilter、ContainerResponseFilter 中没有得到 @autowired
- javascript - 我在小时、分钟和秒小于 10 时添加了一个条件。它会添加前导 0。但它不显示 (06 : 54 : 08)
- javascript - KTDataTable:使用 javascript 将数据放入模式中,使用 KTDatatable 中的按钮
- neural-network - 具有多层感知器反向传播的示例