Scala 使HTTP API服务器与未来异步,如何使其无阻塞?

Scala 使HTTP API服务器与未来异步,如何使其无阻塞?,scala,api,concurrency,future,database-concurrency,Scala,Api,Concurrency,Future,Database Concurrency,我正在尝试编写一个HTTP API服务器,它对特定资源执行基本CRUD操作。它与外部db服务器对话以执行操作。 scala中的Future支持非常好,对于所有非阻塞计算,都使用Future。我在很多地方使用了future,我们用future包装一个操作,并在值最终可用并触发回调时继续 在HTTP API服务器的上下文中,可以实现非阻塞异步调用,但是当GET或POST调用仍然阻塞主线程时,对吗 当发出GET请求时,成功200表示数据成功写入数据库,并且没有丢失。在将数据写入服务器之前,创建的线程仍

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

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

  • 当发出GET请求时,成功200表示数据成功写入数据库,并且没有丢失。在将数据写入服务器之前,创建的线程仍在阻塞,直到从数据库收到插入成功的最终确认,对吗
  • 主线程(在收到http请求时创建)可以委托并获得将来的返回,但它仍然被阻止,直到触发onSuccess,当值可用时触发onSuccess,这意味着db调用成功 我无法理解HTTP服务器可以如何高效地设计以最大限度地提高效率,当数百个请求到达特定端点时会发生什么,以及如何处理它。有人告诉我,斯里克采取了最好的办法


    如果有人能够解释一个成功的http请求生命周期,有未来的,没有未来的,假设有100个db连接线程。

    首先,必须有某种东西阻止最后一个主线程才能继续运行。但这与拥有一个线程池并
    加入它没有什么不同。我不太清楚你在问什么,因为我想我们都同意使用线程/并发比单线程操作更好

    Future
    简单高效,因为它将所有线程处理从您那里抽象出来。默认情况下,所有新的未来都在全局隐式ExecutionContext中运行,这只是一个默认的线程池。一旦您启动了一个
    未来的
    请求,该线程将生成并运行,并且您的程序将继续执行。还有一些方便的构造可以直接操纵未来的结果。例如,您可以在期货上使用
    map
    flatMap
    ,一旦期货(线程)返回,它将运行您的转换

    它不像单线程语言那样,如果您有一个阻塞调用,那么一个未来将实际阻塞整个执行

    当你在比较效率时,你在比较什么

    当发出GET请求时,成功200表示数据被写入 数据库已成功恢复,但未丢失。直到数据写入到 服务器上,创建的线程仍处于阻塞状态,直到最终 已从数据库接收到插入已完成的确认 成功吧

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

    由于
    java.NIO
    是如何在Linux上实现的,所以在JVM上运行时,我们可以免费获得这个

    主线程(在收到http请求时创建)可以委托 并得到一个未来,但它仍然被阻止,直到成功吗 trigged,当值可用时触发,这意味着 数据库调用成功

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

    为了能够接受多个请求,它将永远不会在接受连接的线程上处理路由的处理,它将始终将其委托给后台线程来完成该工作

    一般来说,在Linux和Windows中有许多方法可以实现高效的IO。前者有,而后者有。有关
    epoll
    如何在内部工作的更多信息,请参见一般来说,“非阻塞”在不同的上下文中可能意味着不同的事情:非阻塞=异步(您的第二个问题)和非阻塞=非阻塞IO(您的第一个问题)。第二个问题比较简单(比如说,解决了更传统或更知名的方面),所以让我们从它开始

    主线程(在收到http请求时创建)可以委托并获得将来的返回,但它仍然被阻止,直到触发onSuccess,当值可用时触发onSuccess,这意味着db调用成功

    它没有被阻止,因为Future在不同的线程上运行,所以您的主线程和执行db调用逻辑的线程同时运行(在执行前一个请求的db调用代码时,主线程仍然能够处理其他请求)

    当发出GET请求时,成功200表示数据成功写入数据库,并且没有丢失。直到数据被写入