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

Azure Function部署后二次调用超时,本地运行正常求助排查

问题分析与解决方案

可能的问题原因

1. 客户端资源未正确释放导致实例复用下的连接泄漏

Azure Function会复用运行实例,若函数执行后未正确释放openmeteo_requests.Client或requests.Session资源,后续复用实例的调用可能因连接池耗尽、资源占用卡死而超时。你的代码仅创建了客户端,但未通过上下文管理器显式关闭,资源无法在实例复用时被回收。

2. Open-Meteo API的IP限流策略

Open-Meteo可能对同一IP的请求频率有隐性限制(免费版虽无公开严格限流,但存在实际阈值)。Azure Function实例使用固定出站IP(或共享IP池),首次调用成功后,后续请求被API限流导致超时;更换设备调用时,可能触发新实例启动(对应新IP),因此首次成功,复用同一实例IP后再次触发限流。

3. Pandas/numpy资源残留导致内存耗尽

实例复用场景下,Pandas创建的DataFrame、numpy数组若未被正确回收,会导致实例内存占用持续升高,后续调用因内存不足、GC阻塞而超时。

4. retry_requests重试逻辑加剧资源问题

重试机制在网络或限流场景下可能耗尽重试次数,且若未正确处理连接错误,会进一步加剧连接泄漏或资源占用。


解决方案

1. 用上下文管理器显式释放资源

将requests.Session和openmeteo_requests.Client放入with语句,确保每次调用后资源被彻底释放:

def fetch_and_process_data(lat, lon, input_str):
    today_str, formatted_datetime = format_datetime(input_str)
    
    # 用with管理session和客户端生命周期
    with requests.Session() as session:
        retry_session = retry(session, retries=5, backoff_factor=0.5)
        with openmeteo_requests.Client(session=retry_session) as openmeteo:
            weather_url = "https://api.open-meteo.com/v1/forecast"
            weather_params = {
                "latitude": lat,
                "longitude": lon,
                "timezone": "Europe/London",
                "hourly": ["wind_speed_10m", "wind_direction_10m"],
                "wind_speed_unit": "ms",
                "start_date": today_str,
                "end_date": today_str
            }
            weather_responses = openmeteo.weather_api(weather_url, params=weather_params)
            weather_response = weather_responses[0]
            hourly_weather = weather_response.Hourly()
            weather_data = {
                "date": pd.date_range(
                    start=pd.to_datetime(hourly_weather.Time(), unit="s", utc=True),
                    end=pd.to_datetime(hourly_weather.TimeEnd(), unit="s", utc=True),
                    freq=pd.Timedelta(seconds=hourly_weather.Interval()),
                    inclusive="left"
                ),
                "wind_speed_10m": hourly_weather.Variables(0).ValuesAsNumpy(),
                "wind_direction_10m": hourly_weather.Variables(1).ValuesAsNumpy()
            }
            weather_dataframe = pd.DataFrame(data=weather_data)
    
    # 显式清理大对象并触发GC
    del weather_dataframe, weather_data, hourly_weather, weather_response, weather_responses
    import gc
    gc.collect()
    
    return weather_dataframe

2. 规避IP限流

  • 检查Open-Meteo响应头中的X-RateLimit-*字段,确认是否触发限流;
  • 切换Azure Function到Premium/Dedicated计划,获取固定出站IP后向Open-Meteo申请白名单;
  • 在重试逻辑中加入随机抖动,避免固定间隔触发限流:
    retry_session = retry(session, retries=5, backoff_factor=0.5, jitter=(0.1, 1.0))
    

3. 调整Azure Function实例配置

  • 启用弹性Premium计划,让实例快速扩容,避免单实例被限流或资源耗尽;
  • 设置较短的实例空闲超时(如5分钟),让Azure自动回收复用实例,避免资源泄漏累积。

4. 添加日志定位超时阶段

在关键步骤添加日志,明确超时发生在API请求还是数据处理阶段:

import logging

def fetch_and_process_data(lat, lon, input_str):
    logging.info("开始获取天气数据")
    today_str, formatted_datetime = format_datetime(input_str)
    logging.info(f"请求日期:{today_str}")
    
    with requests.Session() as session:
        # ... 中间步骤添加日志
        logging.info("已获取Open-Meteo响应,开始处理数据")
        # ... 处理逻辑
    
    logging.info("数据处理完成")

通过Azure Portal的Function日志查看具体超时环节,精准定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:39:52