- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章使用Go HTTP客户端打造高性能服务由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
HTTP(超文本传输协议)是一种用于客户端和服务器之间传输数据的通信协议。如果想要访问服务器资源,HTTP 请求是必不可少的。Go 语言里,net/http 包附带了默认配置,我们可以适当调整便可以获得高性能.
大多数语言都有提供各自的 HTTP 客户端,文章接下来部分我们将动手实践如何使用 Go 语言发起 HTTP 请求,并讨论其中有可能遇到的问题.
在做 Go 项目时,我就意识到 HTTP 客户端如果配置不正确可能会随时导致服务器崩溃.
在使用 HTTP Client 时,我观察到一些问题并总结出相应的解决方案,如下所示:
默认情况下,net/http 包自带的 HTTP 客户端不带超时时间。如果你使用的是默认的客户端 http.DefaultClient(),这个是不带超时时间的.
假如你请求外部的 API 挂了,发出的请求没响应导致连接一直出于打开状态。随着请求数越来越多,连接数随之增加,导致耗尽服务器的资源,最后服务器随之崩溃.
解决办法:不要使用默认的 HTTP 客户端,根据实际情况设置超时时间.
1
2
3
|
var httpClient = &http.Client{
Timeout: time.Second * 10,
}
|
对于 API 接口,超时时间建议不需要超过 10s,如果请求在 10s 内没有返回,则请求会取消并报错:request canceled (Client.Timeout exceeded …) .
默认情况下,HTTP 客户端会维护一个连接池。当请求完成之后,连接会保持打开状态直到空闲时间超时(默认是 90s)自动断开。如果有请求过来,会优先使用已打开的连接而不是创建新的连接,请求完成之后,连接会返还到连接池中.
使用连接池将使用最少的服务器资源处理更多的 API 请求.
如果没有自定义 HTTP 客户端的 transport,将会使用默认配置.
HTTP Transport 的默认配置如下:
1
2
3
4
5
6
7
8
9
|
var DefaultTransport RoundTripper = &Transport{
...
MaxIdleConns: 100,
IdleConnTimeout: 90 * time.Second,
...
}
const DefaultMaxIdleConnsPerHost = 2
|
MaxIdleConns 表示连接池大小,是可以打开的最大连接数,默认值是 100.
参数 DefaultMaxIdleConnsPerHost 的默认值是 2,表示每个主机(host)的打开连接数。这意味着,连接池中 100 个连接只有两个连接分配给该主机.
随着请求增多,但是只有两个请求被处理,其他请求只能被迫等待并进入 TIME_WAIT 状态。请求增多,进入 TIME_WAIT 状态的连接数增多,消耗越来越多的服务器资源,当达到服务器瓶颈时,服务器将会崩溃.
解决办法:提高 MaxIdleConnsPerHost 数值,不要使用默认的 Transport.
1
2
3
4
5
6
7
8
9
|
t := http.DefaultTransport.(*http.Transport).Clone()
t.MaxIdleConns = 100
t.MaxConnsPerHost = 100
t.MaxIdleConnsPerHost = 100
httpClient = &http.Client{
Timeout: 10 * time.Second,
Transport: t,
}
|
通过增加每个主机的连接数和空闲连接数,就有助于提高性能并以最少的服务器资源处理更多请求.
可以根据服务器资源和实际需求适当增加连接池大小和每个主机的连接数.
这篇文章中,我们围绕 net/http 包讨论了默认配置的一些问题。通过更改 HTTP 客户端的一些默认设置,在生产环境中也可以获得高性能的 HTTP 客户端.
到此这篇关于使用Go HTTP客户端打造高性能服务的文章就介绍到这了,更多相关Go HTTP客户端高性能内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://www.topgoer.cn/blog-47.html 。
最后此篇关于使用Go HTTP客户端打造高性能服务的文章就讲到这里了,如果你想了解更多关于使用Go HTTP客户端打造高性能服务的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我有以下对象: var myObj = { "4":{//The key is a number String. id:4,name
我需要构建某种字典,其中还包含每个单词在该语言中出现的单词频率。通常,这将使用 std::unordered_map 来实现,对吧?现在问题来了……我想找到所有符合某些正则表达式的单词及其频率,而性能
软件开发通常会提到一个名词 “三高”,即高并发、高性能、高可用。 具体的指标定义,如:高并发方面要求QPS 大于 10万;高性能方面要求请求延迟小于 100 ms;高可用方面要高于 99.99
我有一个大约有 108000 个三角形的网格,应该用 WebGL 渲染。 目前我不使用框架,只使用纯 WebGL。我已经通过 id 映射实现了对象识别,以便使用回调功能和基本的相机操纵器进行拾取。 现
我读过无数的帖子,无数次地重写过代码,我发现自己碰壁了。由于应用了 CSS scale3d 转换的容器,我试图克服在滚动页面时不使用 CSS 固定元素位置的限制。虽然我最新的解决方案有效,但它有时仍然
我正在开发一个嵌入式系统,它需要非常频繁地存储和检索数据。我预计每秒可能有 100 次写入和 10 次读取。数据将以突发而不是连续的方式到达。 我想使用 SQLite 来存储所有这些数据,但由于它是一
当前情况 在我们的一款 SPA Web 应用程序中,我们使用自定义跟踪器请求来跟踪各种用户操作,例如 cta 点击、页面导航 等,该请求将一些信息传递到后端使用 POST 请求。 问题现在,因为这些跟
我正在编写执行大量表查找的程序。因此,当我偶然发现 Data.Map (当然),以及 Data.HashMap 和 Data.Hashtable 时,我正在仔细阅读 Haskell 文档>。我不是散列
我正在评估我们的高性能电信应用程序的 BPEL 引擎,但性能似乎很差。我们评估了 Apache Ode、SunBPEL 引擎、Active BPEL 等。您知道任何更快的 BPEL 引擎实现或 C/C
我目前正在重写一个旧的 ASP\ASP.NET 应用程序。由于我无法完全重写,所以我需要分部分进行。现在我正在将代码库从 ODBC 升级到 .net 连接器。 有一个函数可以在用户每次访问页面时进行一
旁注:我正在使用 JQuery,但没有使用任何第三方表格组件(我现在也不能)。 我的问题是我应该能够显示很多(10000)条经过的消息——每秒都会有数百条新消息,它们应该被添加到底部。当我们达到 10
为了争论,假设我试图在 MySQL 表中表示一个非常简单的文件系统。请注意,这并不是我正在做的,它只是为问题的简单基础做准备。所以不要费心告诉我存储文件的更好方法。该表的架构如下: varchar p
我希望优化我使用python时遇到的大数据解析问题的性能。以防有人感兴趣:下面显示的数据是六种灵长类动物全基因组DNA序列比对的片段。 目前,我知道如何处理这类问题的最好方法是打开我的~250(大小2
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我需要用 Ruby 制作一个小应用程序,它将以不同颜色显示通过 TCP 接收的日志行。推荐用于此类应用的 GUI 框架是什么? 我应该在 Windows 和 Linux 上工作。 最佳答案 Shoes
我正在尝试编写一个非常简单的 Web 服务器来执行以下操作: 接收请求。 响应一个小文件;关闭连接。 处理请求数据。 换句话说,响应不依赖于请求信息,但请求信息仍然很重要。数据将被保留,然后用于分析。
我正在使用 WebSocket 协议(protocol)(通过 WebSocketSharp)开发 C# 游戏服务器。目前,每当用户登录游戏时,我都会创建一个 token 并将其添加到 Concurr
我正在处理应用程序的延迟敏感部分,基本上我会收到一个网络事件来转换数据,然后将所有数据插入到数据库中。在分析之后,我发现基本上我所有的时间都花在了保存数据上。这是代码 private void ins
我正在尝试将视频输出(帧序列)输出到任何 qt 可见小部件。一开始我认为 QLabel 就足够了......但我错了。转换为像素图对于大型图像的处理器来说过于过载:例如 1080p。 还有其他解决方案
我是一名优秀的程序员,十分优秀!