【问题标题】:Thread model for Async API implementation using Spring使用 Spring 实现异步 API 的线程模型
【发布时间】:2021-07-15 02:36:13
【问题描述】:

我正在开发使用 Spring Boot 开发的微服务。我已经实现了以下层:

  • 控制器层:当用户发送 API 请求时调用
  • 服务层:处理请求。向第三方服务发送请求或向数据库发送请求
  • 存储库层:用于与 数据库

.

上述所有层中的方法都返回 CompletableFuture。我有以下与此设置相关的问题:

  1. 从所有层的所有方法返回 Completable future 是一种好习惯吗?

  2. 在使用 CompletableFuture 时是否总是建议使用 @Async 注解?当我使用默认的 fork-join 池处理请求时会发生什么?

  3. 如何为上述方法配置线程?每层配置线程池是个好主意吗?我可以在这里考虑哪些其他配置?

  4. 在优化此微服务的性能时,我应该关注哪些指标?

【问题讨论】:

    标签: spring-boot


    【解决方案1】:

    如果您的应用程序正在执行的工作可以在请求线程上完成而没有太多延迟,我会推荐它。如果您发现您的 Web 服务器的工作线程不足,您可以随时切换到异步模型。

    @Async 注解基本上有助于调度。如果可以,请使用它 - 它可以使代码不受对将在其上安排工作的线程池的引用。至于您的异步工作实际上是哪个线程,这完全取决于您。如果可以,请使用自己的游泳池。这将确保您可以添加检测并公开服务运行后可能需要的配置选项。

    从技术上讲,您将有两个池子在玩。 Spring 将使用一个来消耗您未来的结果,另一个将用于执行异步工作。如果我没记错的话,如果你还没有,Spring Boot 会配置它的池,如果你没有明确配置它,它会记录一个警告。至于你的工作线程,从简单开始。考虑使用 Spring 的ThreadPoolTaskExecutor

    关于要监控的指标,首先要选择监控方式。使用 Spring Sleuth 和 Spring Actuator 之类的东西会给你很多开箱即用的信息。有许多服务可以将执行器生成的所有指标收集到基于时间的数据库中,然后您可以使用这些数据库来分析性能并获得一些关于调整什么的想法。

    最后一个建议是 Spring 的 Web Flux 从一开始就设计为异步的。它肯定有一个学习曲线,因为响应式代码与通常的 MVC 代码非常不同。但是,该框架也会考虑您提出的所有问题,因此它可能更适合您的应用程序,特别是如果您想让所有内容默认为异步。

    【讨论】:

    • 您好尼克,非常感谢您分享您的想法。
    猜你喜欢
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    相关资源
    最近更新 更多