gpt4 book ai didi

java - 异步 HTTP 请求与新线程上的 HTTP 请求

转载 作者:太空宇宙 更新时间:2023-11-04 11:15:15 24 4
gpt4 key购买 nike

我有 2 个微服务(A 和 B)。

A 有一个接受 POST 请求的端点。当用户发出 POST 请求时,会发生这种情况:

  1. 服务 A 从 POST 请求正文中获取对象并将其存储在数据库中。
  2. 服务 A 将对象转换为不同的对象。新对象通过 Jersey HTTP 客户端发送到服务 B。

第 2 步发生在我创建的 Java 线程池 (Executors.newCachedThreadPool) 上。通过在新线程上执行步骤 2,服务 A 端点的响应时间不会受到影响。

但是,如果服务 B 响应时间较长,则服务 A 在接收大量 POST 请求时可能会创建过多线程。为了帮助解决这个问题,我可以使用固定线程池 (Exectuors.newFixedThreadPool)。

除了固定线程池之外,是否还应该使用异步非阻塞 HTTP 客户端?比如这里的:https://hc.apache.org/httpcomponents-asyncclient-dev/ 。我使用的 Jersey HTTP 客户端正在阻塞。

看来使用异步HTTP客户端是正确的。 但是如果我切换到固定线程池,我认为异步 HTTP 客户端不会提供显着的好处 - 我的想法是错误的吗?

最佳答案

即使您使用固定线程池其中的所有线程都将在第 2 步被阻止,这意味着它们不会执行任何有意义的工作 - 只需等待您的 API 返回响应,这不是务实的资源管理。在这种情况下,您将能够处理有限数量的传入请求,因为线程池中的线程将始终处于繁忙状态,而不是处理新请求。

对于非阻塞客户端,您只阻塞一个线程(我们称之为调度程序线程),该线程负责发送和等待所有请求/响应。它将在“while 循环”(您可以将其称为事件循环)中运行,并检查是否收到所有包作为响应,以便它们准备好工作线程被拾取。

在后一种情况下,您将获得大量可用线程来准备执行一些有意义的工作,因此您的吞吐量将会增加。

关于java - 异步 HTTP 请求与新线程上的 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45526675/

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