- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
其实网上有大量讨论HTTP长连接的文章,而且Idle Timeout和KeepAlive Timeout都是HTTP协议上的事情,跟Vert.x本身没有太大关系,只不过最近在项目上遇到了一些问题,用到了Vert.x的HttpClient,就干脆总结一下,留给自己今后做参考.
在使用Vert.x的HttpClient的时候,可以使用HttpClientOptions配置KeepAlive Timeout以及Idle Timeout的行为,本文将讨论在Vert.x HttpClient中Idle Timeout的设置、如何启用和禁用KeepAlive,以及如果启用KeepAlive,其超时设置(Timeout)对HTTP连接保活的影响.
需要注意的是,这是客户端的设置,服务端由于实现技术多样,这里不深入讨论,本文默认服务端已经开启了KeepAlive(事实上也是大多数HTTP服务器的默认行为).
本文讨论的场景仅适用HTTP/1.1的情况,HTTP/1.0处理KeepAlive方式略有不同,HTTP/1.1默认支持KeepAlive,HTTP/1.0需要显式在header里加入Connection: keep-alive.
这里我们设定多个场景来测试不同情况下,整个系统的行为表现是什么.
HttpClientOptions里使用setKeepAlive(false)来禁用KeepAlive:
final HttpClientOptions options = new HttpClientOptions()
.setKeepAlive(false);
此时,Vert.x Http Client会在请求头中加入connection: close,表示在完成一次HTTP request/response的流程后,服务端需要主动发起关闭连接请求:
Wireshark抓包分析:
connection: close
,所以服务端主动发起(FIN, ACK)数据包,表示服务端已关闭连接,客户端获得数据包后,返回ACK表示确认,然后也向服务端发出(FIN, ACK),表示客户端也关闭了连接,最后服务端返回ACK,表示确认HttpClientOptions里使用setKeepAlive(false)来禁用KeepAlive:
final HttpClientOptions options = new HttpClientOptions()
.setKeepAliveTimeout(15)
.setKeepAlive(true);
此时,Vert.x Http Client并不会发送connection: close头,因为HTTP/1.1默认使用长连接,所以无需额外指定任何请求头。在KeepAlive超时后,会由客户端主动关闭HTTP连接.
Wireshark抓包分析:
如果服务端的KeepAlive Timeout大于HttpClient的KeepAlive Timeout,那么当一段时间内没有任何HTTP请求发出,在HttpClient KeepAlive首先超时前,HTTP连接可以一直被重用,直到HttpClient KeepAlive超时,由客户端发起关闭连接请求:
如果服务端的KeepAlive Timeout小于HttpClient的KeepAlive Timeout(比如服务端KeepAlive Timeout为10s),那么当一段时间内没有任何HTTP请求发出,服务端会首先发起关闭连接请求:
为了模拟这样的场景,在创建Vert.x HttpClient时,使用如下HttpClientOptions:
final HttpClientOptions options = new HttpClientOptions()
.setIdleTimeout(5)
.setIdleTimeoutUnit(TimeUnit.SECONDS)
.setKeepAliveTimeout(20)
.setKeepAlive(true);
然后让服务端在返回HTTP Response的时候,先等待7秒钟:
[HttpGet(Name = "GetWeatherForecast")]
public async Task<IEnumerable<WeatherForecast>> Get()
{
await Task.Delay(7000);
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
Wireshark抓包分析:
因此,可以这样理解这两个设置:
IdleTimeout
设置得比较短,而 KeepAliveTimeout
设置得比较长,连接会因为空闲超时(Idle Timeout)而关闭。因此,当新的 HTTP 请求到来时,需要建立新的连接。IdleTimeout
设置得比较长,而 KeepAliveTimeout
设置得比较短,在 Keep-Alive 有效时间内,即使当前连接上有请求在等待响应,该连接仍然可以接收新的 HTTP 请求,直到 Keep-Alive 超时触发。在vert.x中,RequestOptions也有类似的setIdleTimeout的方法来设置Idle Timeout,但它的作用域仅限于当前的HTTP请求,而HttpClientOptions.setIdleTimeout作用域为整个应用程序全局.
仍然使用上面【场景二】的环境设定,只是让客户端每隔KeepAlive Timeout相同时间发送一次请求,会发现,多数情况下,请求可以成功,但有时候会发生错误。比如,如果服务端KeepAlive Timeout为10秒,客户端也是每隔10秒发送请求:
io.vertx.core.net.impl.ConnectionBase SEVERE: Connection reset
Connection: keep-alive
,默认禁用Connection: close
,默认启用min(ckt, skt)
时间段内如果没有新的HTTP请求,并且HTTP连接处于空闲状态,客户端会发起HTTP连接关闭min(ckt, skt)
时间段内如果没有新的HTTP请求,并且HTTP连接处于空闲状态,服务端会发起HTTP连接关闭两者是独立的设置,但在某些情况下可能会产生交互。例如,如果 IdleTimeout 设置的时间比 KeepAliveTimeout 短,那么连接可能会因为空闲超时而关闭,即使 Keep-Alive 允许更长时间的连接复用.
最佳实践(参考自ChatGPT) 。
KeepAliveTimeout
。IdleTimeout
。IdleTimeout
时,确保它足够长以完成请求处理,但不要过长以免浪费资源。KeepAliveTimeout
时,确保它能够有效地复用连接以提高性能。通过合理设置这两个超时值,可以优化连接的使用效率,同时避免不必要的资源占用.
最后此篇关于Vert.xHttpClient调用后端服务时使用IdleTimeout和KeepAliveTimeout的行为分析的文章就讲到这里了,如果你想了解更多关于Vert.xHttpClient调用后端服务时使用IdleTimeout和KeepAliveTimeout的行为分析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是 Vert.X 新手。 Vert.x 是否有内置的集中式过滤器?我的意思是您将在 J2EE 应用程序上使用的过滤器类型。 例如,所有页面都必须经过身份验证过滤器或类似的操作。 在 Vert.x 中
正在关注 similar question在 Spring 。我希望能够在路由器中获得响应。并进行响应刷新,这样我就可以在不延长 RTT 的情况下继续在服务器上工作 意思是,做一些类似 Spring
我正在我的一个工作线程中进行阻塞服务调用,并记录了警告。这是通过增加时间限制来“解决”的,但是,我更好奇如何读取日志行中线程的命名 - vert.x-worker-thread-3,5,main。完整
我是 vert.x 的新手。我不寻找代码片段/示例,因为 vert.x github 页面充满了它们。 我正在寻找一些事实和最佳实践。 我正在编写一个应用程序,其主要verticle是一个处理Rest
顶点中的 TCP 服务器/网络服务器和 HTTP 服务器有什么区别? 每个的用例是什么? 我尝试谷歌搜索并浏览了官方网站,他们都没有明确的解释。 最佳答案 首先,在通用网络中,有两种常见的处理连接类型
如上所示,我需要构建一个 Vert.x Java 应用程序,该应用程序将作为 HTTP 服务器/虚拟主机(TLS Http 流量、Web 套接字流量),它将重定向/ channel 特定域流量到其他
我正在尝试为 Vert.x 开发一个概念验证——一个简单的实时浏览器游戏。 让我们想象一个类似于在线扑克的游戏 - 您有一个大厅,里面有许多您可以加入的现有游戏。您还可以创建一个新游戏(因此该大厅中的
我的问题是在内联列表之后有一个垂直列表 li {display:inline;} li.vert (color:red;} 如何让 li.vert 垂直显示它显示红色 OK 但内联 最佳答案
其实网上有大量讨论HTTP长连接的文章,而且Idle Timeout和KeepAlive Timeout都是HTTP协议上的事情,跟Vert.x本身没有太大关系,只不过最近在项目上遇到了一些问题,用到
是否可以为路径添加 2 个处理程序? 我需要加载 html文件夹中的内容并检查 session我访问时的值 /小路。 如果我放置 router.route().handler(StaticHandle
在 vertx docs他们提到有可能限制每个 vertx 实例的事件循环线程数: Instead of a single event loop, each Vertx instance mainta
考虑其中一个顶点抛出未捕获异常的情况。 接下来发生什么? 如果从系统中删除了 Verticle 状态,是否有一些类似于 erlang supervisor 的机制来重新启动 Verticle? 关于这
我正在使用vert.x 2.1.5版本。我试图在项目中使用事件循环。下面给出的示例代码 JsonObject result = null; //loop starting for (int i=0;i
我确实有同时使用协程和Vert.x的项目。 我正在尝试编写包装器函数以在vertx工作线程池上运行阻塞代码 就像是: suspend inline fun executeOnWorkerThread
Closed. This question is not reproducible or was caused by typos。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-to
我最近在java中使用vert.x框架,但我对vert.x还是新手。 通常当我们按照以下方式启动 future 时 SMObj自动分配给promise1 promise 。 Future future
查看 Vert.x 应用程序的日志,我注意到在取消部署 verticle 时出现以下异常(所有 3 个异常都是相同的): Failed to undeploy netsci.graphservice.
我正在将超时上下文传递给 Server.Shutdown(http 包)。我看不出我需要调用返回的取消函数,所以我忽略了它。但是当我运行 go vet 时,它说 context.WithTimeout
在这篇文章中,我们将会看到怎样在vert.x应用中使用HSQL,当然也可以使用任意JDBC,以及使用vertx-jdbc-client提供的异步的API,这篇文章的代码在github。 异步?
在我正在实现的 Vert.x verticle 中,我有一个之前加载到内存中的缓冲区,现在我想将它转储到磁盘中。 据我所知,我们应该使用 Pump 来确保不会使 WriteStream 过载。 但我没
我是一名优秀的程序员,十分优秀!