编辑
2025-01-15
日常随记
00
请注意,本文编写于 187 天前,最后修改于 187 天前,其中某些信息可能已经过时。

目录

源码分析
解决办法

在使用腾讯云的cos的sdk过程中,发现现网有异常反馈,返回的错误就一个EOF,针对这个问题,做个一个排查记录

腾讯云cos-sdk路径:https://github.com/tencentyun/qcloud-cos-sts-sdk/blob/master/go/sts.go#L130

源码分析

在上述源码中,我们可以看到如下代码,当初始化Cosclient的时候,如果没有传入http.Client,会使用默认的 Clipboard_Screenshot_1736946026.png

默认的参数中有一个DisableKeepAlives 参数用来控制是否关闭长连接,默认是关闭的

Clipboard_Screenshot_1736946132.png

这就导致在高并发的情况下,有可能长连接超时,服务端已经给客户端发了FIN,然后客户端此时触发了POST请求,因为服务端已经关了连接,所以读到了EOF,导致报错。

解决办法

既然知道了问题,解决的办法也就简单了

  • 自定义一个client,关闭长连接
go
tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, TLSHandshakeTimeout: 10 * time.Second, DisableKeepAlives: true, ResponseHeaderTimeout: 5 * time.Second, ExpectContinueTimeout: 1 * time.Second, } netClient := &http.Client{ Transport: tr, Timeout: 10 * time.Second, } c := sts.NewClient(cosConf.SecretId, cosConf.SecretKey, netClient)
  • 针对每一个用户获取上传凭证时,添加缓存(凭证本来就是有时效的)授权路径时,可以写稍微通用点的

Clipboard_Screenshot_1736946454.png

本文作者:瓜儿爸

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!