gpt4 book ai didi

scala - 使 HTTP API 服务器与 Future 异步,如何使其成为非阻塞的?

转载 作者:行者123 更新时间:2023-12-01 11:18:24 24 4
gpt4 key购买 nike

我正在尝试编写一个 HTTP API 服务器,它对特定资源执行基本的 CRUD 操作。它与外部数据库服务器通信以执行操作。Scala 中的 Future 支持非常好,对于所有非阻塞计算,都使用 Future。我在很多地方使用了 future,在这些地方我们用 future 包装一个操作并继续前进,当值最终可用并触发回调时。

在 HTTP API 服务器的上下文中,可以实现非阻塞异步调用,但是当 GETPOST 调用仍然阻塞主线程时?

  1. 当发出 GET 请求时,成功 200 表示数据已成功写入数据库并且没有丢失。在数据写入服务器之前,创建的线程仍然处于阻塞状态,直到从数据库收到插入成功的最终确认,对吗?
  2. 主线程(在收到 http 请求时创建)可以委托(delegate)并取回 Future,但它是否仍然处于阻塞状态,直到 onSuccess 被触发,它在值可用时被触发,这意味着数据库调用成功。

我无法理解如何设计 HTTP 服务器以最大限度地提高效率,当几百个请求到达特定端点时会发生什么,以及如何处理它。有人告诉我,slick 采用了最好的方法。

假设有 100 个 db 连接线程,如果有人可以解释一个成功的 http 请求生命周期,有 future 和没有 future。

最佳答案

When a GET request is made, a success 200 means the data is written to the db successfully and not lost. Until the data is written to the server, the thread that was created is still blocking until the final acknowledgement has been received from the database that the insert is successful right?

为特定请求创建的线程根本不需要阻塞。当您启动一个 HTTP 服务器时,您总是有“主”线程在运行并等待请求的到来。一旦请求开始,它通常被卸载到从线程池(或 ExecutionContext)。为请求提供服务的线程不需要阻塞任何东西,它只需要注册一个回调,上面写着“一旦这个 future 完成,请用成功或失败指示完成这个请求”。与此同时,客户端套接字仍在等待来自您的服务器的响应,没有任何返回。例如,如果我们在 Linux 上并使用 epoll,那么我们向内核传递一个文件描述符列表以监视传入数据并等待该数据可用,我们将在其中获得返回通知。

由于 java.NIO 是如何为 Linux 实现的,我们在 JVM 上运行时免费获得它。

The main thread (created when http request was received) could delegate and get a Future back, but is it still blocked until the onSuccess is trigged which gets triggered when the value is available, which means the db call was successful.

主线程通常不会被阻塞,因为它负责接受新的传入连接。如果您从逻辑上考虑,如果主线程阻塞直到您的请求完成,这意味着我们只能处理一个并发请求,谁想要一个一次只能处理一个请求的服务器?

为了能够接受多个请求,它永远不会在它接受连接的线程上处理路由的处理,它总是将它委托(delegate)给后台线程来完成这项工作。

一般来说,在 Linux 和 Windows 中都有很多方法可以进行高效的 IO。前者有epoll而后者有 IO completion ports .有关 epoll 内部如何工作的更多信息,请参阅 https://eklitzke.org/blocking-io-nonblocking-io-and-epoll

关于scala - 使 HTTP API 服务器与 Future 异步,如何使其成为非阻塞的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47369971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com