有的时候,并发太高,会看到 oss 报错:Connection pool is full, discarding connection: xxxx.oss-cn-hangzhou-internal.aliyuncs.com
一开始以为是 aliyun oss 服务端的限制,限制了最大连接数
但是查阅 aliyun oss 的文档后发现,aliyun oss 服务端并没有这样的限制
所以,怀疑是 aliyun oss python sdk client 的问题
然后我问了一下 chatGPT
有模有样,但是根本没有办法用
首先是根本没有 PoolManager
再然后,Bucket 也没有 pool 参数
class Bucket(_Base):
"""用于Bucket和Object操作的类,诸如创建、删除Bucket,上传、下载Object等。
用法(假设Bucket属于杭州区域) ::
>>> import oss2
>>> auth = oss2.Auth('your-access-key-id', 'your-access-key-secret')
>>> bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', 'your-bucket')
>>> bucket.put_object('readme.txt', 'content of the object')
<oss2.models.PutObjectResult object at 0x029B9930>
:param auth: 包含了用户认证信息的Auth对象
:type auth: oss2.Auth
:param str endpoint: 访问域名或者CNAME
:param str bucket_name: Bucket名
:param bool is_cname: 如果endpoint是CNAME则设为True;反之,则为False。
:param session: 会话。如果是None表示新开会话,非None则复用传入的会话
:type session: oss2.Session
:param float connect_timeout: 连接超时时间,以秒为单位。
:param str app_name: 应用名。该参数不为空,则在User Agent中加入其值。
注意到,最终这个字符串是要作为HTTP Header的值传输的,所以必须要遵循HTTP标准。
"""
所以,我该怎么办?
还有一个子问题,就是 aliyun oss python sdk 连接 oss server 的时候,使用的是 HTTP 协议。那么这里的连接池,复用的应该不是 HTTP 层面的东西,而是 HTTP 底层的 TCP 连接,是吗?
https://github.com/aliyun/aliyun-oss-python-sdk/blob/master/oss2/api.py
https://github.com/aliyun/aliyun-oss-python-sdk/blob/master/oss2/http.py
我们可以看到,其实,Session 对象是可以指定连接池的大小的,但是外层的 Bucket 对象没有传递这个参数
所以,我提交了一个 PR:https://github.com/aliyun/aliyun-oss-python-sdk/pull/336