You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure存储文件ServiceRequestError连接超时问题修复求助

解决Azure存储文件create_directory()超时问题

以下是针对该偶发超时问题的具体修复方案:

1. 自定义重试策略应对网络波动

Azure SDK默认重试策略可能无法覆盖所有网络异常场景,需配置更灵活的重试规则,比如增加重试次数、指数退避间隔:

from azure.storage.fileshare import ShareDirectoryClient
from azure.core.pipeline.policies import ExponentialBackoffRetry

# 配置指数退避重试:最多5次重试,初始间隔1秒,后续指数增长
retry_policy = ExponentialBackoffRetry(
    max_retries=5,
    backoff_factor=1,
    retry_on_status_codes=[408, 429, 500, 502, 503, 504]
)

# 创建客户端时传入自定义重试策略
self.dir_client = ShareDirectoryClient.from_connection_string(
    conn_str=self.connection_string,
    share_name=self.share,
    directory_path=dir_name,
    retry_policy=retry_policy
)

2. 分离配置连接超时与操作超时

你当前设置的create_directory(timeout=60)是操作超时(请求发送后等待响应的时长),但报错中的connect timeout=20是TCP连接建立超时,需单独配置:

from azure.core.pipeline.transport import RequestsTransport

# 配置连接超时(建立TCP连接的时间)和读取超时(等待响应的时间)
transport = RequestsTransport(
    connection_timeout=30,  # 连接超时设为30秒
    read_timeout=60         # 读取超时设为60秒
)

self.dir_client = ShareDirectoryClient.from_connection_string(
    conn_str=self.connection_string,
    share_name=self.share,
    directory_path=dir_name,
    transport=transport
)

3. 复用客户端实例减少连接开销

每次创建目录都重新生成ShareDirectoryClient会增加连接建立的开销,建议复用ShareClient并从中获取DirectoryClient:

# 初始化时创建ShareClient,后续复用
def __init__(self, connection_string, share_name):
    self.share_client = ShareClient.from_connection_string(
        conn_str=connection_string,
        share_name=share_name
    )

def create_dir(self, dir_name: str):
    if not self.dir_exists(dir_name):
        # 从已有的ShareClient获取DirectoryClient
        self.dir_client = self.share_client.get_directory_client(dir_name)
        self.dir_client.create_directory(timeout=60)

4. 捕获超时异常并手动重试

在业务代码中针对超时异常做捕获,实现针对性的重试逻辑:

from azure.core.exceptions import ServiceRequestError

def create_dir(self, dir_name: str):
    max_retry = 3
    for attempt in range(max_retry):
        try:
            if not self.dir_exists(dir_name):
                self.dir_client = self.share_client.get_directory_client(dir_name)
                self.dir_client.create_directory(timeout=60)
            break
        except ServiceRequestError as e:
            if "timed out" in str(e) and attempt < max_retry - 1:
                continue  # 仅对超时异常进行重试
            raise  # 非超时或重试耗尽时抛出异常

5. 排查网络环境问题

  • 确认应用所在网络未通过防火墙或代理拦截Azure存储服务的443端口
  • 若应用部署在Azure内部,使用存储服务私有端点,避免公网网络波动影响

内容的提问来源于stack exchange,提问作者noa mendelovich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 09:20:36