当前位置: 首页 > 知识库问答 >
问题:

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

后易安
2023-03-14

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

有一个接受POST请求的endpoint。当用户发出发布请求时,会发生以下情况:

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

步骤 2 发生在我创建的 Java 线程池(Executors.new缓存线程池)上。通过在新线程上执行步骤 2,服务 A 的终结点的响应时间不受影响。

但是,如果服务B需要很长时间来响应,那么当服务A接收到许多POST请求时,它可能会创建太多的线程。为了帮助解决这个问题,我可以使用一个固定的线程池(Exectuors.newFixedThreadPool)。

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

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

共有3个答案

羊毅庵
2023-03-14

使用非阻塞HTTP-Client的原因是为了防止过多的CPU被用于线程切换。如果您已经通过限制后台线程的数量解决了这个问题,那么非阻塞IO不会提供任何明显的好处。

您的设置还有另一个问题:它非常容易受到DDOS攻击(有意或无意的)。如果某人非常频繁地调用您的服务,将会在内部产生巨大的工作负载,使服务长时间处于繁忙状态。您肯定需要限制后台任务队列(这是Executor类的一个受支持的特性),如果有太多未完成的任务,则返回503(或等效的)。

郁光熙
2023-03-14

不同之处在于,对于同步客户端,步骤A线程将连接到步骤2endpoint并等待响应。使步骤2的实现异步化,直接返回200(或其他)将有助于减少等待时间;但它仍将进行连接并等待响应。

用非阻塞客户端代替,步骤A调用本身将由另一个线程来完成。所以一切都是从第一步开始解开的。此外,系统可以将该线程用于其他事情,直到它从步骤B获得响应并需要恢复工作。

其思想是,源线程将不会空闲太多时间等待响应,而是在这段时间内被重用以完成其他工作。

傅旺
2023-03-14

即使您使用固定线程池,其中的所有线程也会在第2步被阻塞,这意味着它们不会做任何有意义的工作——只需等待您的API返回一个非实用资源管理的响应即可。在这种情况下,您将能够处理有限数量的传入请求,因为线程池中的线程总是很忙,而不是处理新请求。

在非阻塞客户机的情况下,您只阻塞了一个负责发送和等待所有请求/响应的线程(让我们称之为dispatcher thread)。它将在一个“while循环”(您可以称之为事件循环)中运行,并检查是否所有的包都作为响应被接收,以便它们为工作线程的拾取做好准备。

在后一个场景中,您将获得更多可用线程,准备执行一些有意义的工作,因此吞吐量将增加。

 类似资料:
  • 主要内容:HTTP请求完整格式HTTP请求完整格式 HTTP请求由3部分组成(请求行+请求头+请求体): 下面是一个实际的请求示例: ①是请求方法,HTTP/1.1 定义的请求方法有8种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE,最常的两种GET和POST,如果是RESTful接口的话一般会用到GET、POST、DELETE、PUT。 ②为请求对应的URL地址,它和报文头的Hos

  • 获取请求 要通过依赖注入的方式来获取当前 HTTP 请求的实例,你应该在控制器方法中引入 Illuminate\Http\Request 类。传入的请求实例将通过 服务容器 自动注入: <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class UserController extends Controll

  • Blade 支持注解的方式或者使用 Request 对象获取请求信息。 表单参数 先看看 Request 提供的操作表单参数的API Optional<String> query(String name) Optional<Integer> queryInt(String name) Optional<Long> queryLong(String name) Optional<Double> qu

  • 该插件适用于一般的请求场景,只支持post、get、put和delete请求,目前不适用于其他的请求形式,比如上传,下载等。插件定位为 小而美,而不是大而全,目标是切合实际,开箱即用。 平台差异说明 App H5 微信小程序 支付宝小程序 百度小程序 头条小程序 QQ小程序 √ √ √ √ √ √ √ 由于某些小程序平台的限制: delete请求,不支持支付宝和头条小程序(HX2.6.15) pu

  • 问题内容: 我在使用OAuth编写的应用程序中使用了许多HTTP请求。目前,我以相同的方式发送GET和POST请求: 这工作正常。我成功地发布和获取。但是,我担心我没有正确执行POST。我需要在上面的代码中包含以下if语句吗? 如果是这样,为什么?有什么不同?我将不胜感激任何反馈。 谢谢! 问题答案: 内容类型必须与的 实际 格式匹配。仅当内容类型实际经过url编码时,才需要内容类型。例如,您对P

  • 嘿,希望有人能帮我一下。 我正在尝试使用Scala Actors和 Netty.io 库来获取异步http请求。(是的,我知道Scala演员正在被弃用,但这对我来说是一个学习练习) 我编写了一个角色,它接受案例类Request Page(uri: URI)形式的消息。 当它接收到消息时,它创建了必要的Netty对象,需要发出超文本传输协议请求,我已经基于来自[](http://static.net