我正在尝试编写一个对特定资源执行基本 CRUD 操作的 HTTP API 服务器。它与外部数据库服务器对话以执行操作。scala 中的未来支持非常好,并且对于所有非阻塞计算,都使用了未来。我在很多地方都使用过未来,我们用未来包装一个操作并继续前进,当值最终可用并触发回调时。
来到 HTTP API 服务器的上下文,可以实现非阻塞异步调用,但是当一个GET
或一个POST
调用仍然阻塞主线程时,对吗?
- 发出 GET 请求时,成功 200 表示数据已成功写入数据库且未丢失。在将数据写入服务器之前,创建的线程仍然处于阻塞状态,直到从数据库接收到插入成功的最终确认,对吧?
- 主线程(在收到 http 请求时创建)可以委托并返回 Future,但它是否仍然阻塞,直到触发 onSuccess,当值可用时触发,这意味着 db 调用成功。
我无法理解 HTTP 服务器的设计效率如何以最大限度地提高效率,当数百个请求到达特定端点时会发生什么以及如何处理它。有人告诉我,slick 采用了最好的方法。
假设有 100 个 db 连接线程,如果有人可以用未来和没有未来来解释成功的 http 请求生命周期。