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

Azure CosmosDB模拟器间歇性无响应的原因及解决方法咨询

CosmosDB模拟器间歇性连接失败(Windows 10 + MongoDB API)

环境信息

  • 操作系统:Windows 10
  • 服务端/客户端均未使用Docker
  • 使用CosmosDB模拟器的MongoDB API
  • 客户端:脚本用pymongo同步连接,Web服务用motor异步连接

问题现象

数据库间歇性拒绝连接,多数时候无响应,偶尔能正常连接;故障持续一段时间后会自行恢复。pymongo和motor均报相同错误:

pymongo.errors.ServerSelectionTimeoutError: localhost:10255: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate (_ssl.c:1129), Timeout: 100.0s, Topology Description: <TopologyDescription id: 63aaec350ac3d3aa70c8bcf7, topology_type: Unknown, servers: [<ServerDescription ('localhost', 10255) server_type: Unknown, rtt: None, error=AutoReconnect('localhost:10255: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate (_ssl.c:1129)')>]>

已尝试将超时时间调至200秒,问题依旧。

示例代码(数据导入脚本)

with open(data_filename, 'r') as infile:
    new_items = json.load(infile)

CONNECTION_STRING = os.environ.get('MONGODB_URL')
client = pymongo.MongoClient(CONNECTION_STRING)
db = client[constants.DB_NAME]
collection = db[constants.COLLECTION_CONTACTS]

with pymongo.timeout(100):
    for item in new_items:
        existing_items = collection.find(filter={'name': item['name']})
        if existing_items:
            print(f'Item exists for {existing_items[0]["name"]} with id: {[i["_id"] for i in existing_items]}')
            # continue

可能原因及解决办法

1. 自签名证书信任问题

Windows系统对CosmosDB模拟器的自签名证书信任可能间歇性失效,尤其是系统更新或模拟器重启后:

  • 手动导入证书到信任存储:
    1. 点击右下角CosmosDB模拟器托盘图标,选择「导出SSL证书」,保存到默认路径(C:\Users\<你的用户名>\Documents\Azure Cosmos DB Emulator\certificates)
    2. 右键证书文件→「安装证书」,选择「当前用户」,下一步
    3. 选择「将所有证书放入下列存储」,点击「浏览」,选择「受信任的根证书颁发机构」完成导入
  • 连接时显式指定证书路径:
    在客户端初始化时添加证书路径参数,避免验证异常:
    # pymongo示例
    client = pymongo.MongoClient(
        CONNECTION_STRING,
        ssl_ca_certs=r'C:\Users\<你的用户名>\Documents\Azure Cosmos DB Emulator\certificates\cosmosdbemulatorcert.pem'
    )
    
    # motor示例
    client = motor.motor_asyncio.AsyncIOMotorClient(
        CONNECTION_STRING,
        ssl_ca_certs=r'C:\Users\<你的用户名>\Documents\Azure Cosmos DB Emulator\certificates\cosmosdbemulatorcert.pem'
    )
    

2. 模拟器资源占用过高

Windows 10上模拟器可能因内存/CPU占用过高导致间歇性无响应:

  • 打开任务管理器,查看Azure Cosmos DB Emulator进程资源占用,若持续过高:
    1. 右键托盘图标→「停止」,等待服务停止后再「启动」
    2. 进入模拟器设置(托盘图标→Settings),降低内存配额
    3. 关闭其他高资源占用程序,释放系统资源

3. 端口冲突或网络拦截

模拟器默认使用10255端口,若被其他程序间歇性占用或防火墙拦截,会导致连接失败:

  • 用netstat -ano | findstr :10255检查端口占用,若有其他进程占用,结束该进程或修改模拟器端口(设置→MongoDB Port),同步更新连接字符串
  • 禁用Windows防火墙或添加CosmosDB模拟器的入站/出站规则,避免拦截
  • 禁用未使用的虚拟网卡(如VPN、Hyper-V适配器),避免路由异常

4. Python SSL缓存问题

Python SSL库可能缓存证书状态,导致间歇性验证失败:

  • 本地开发环境可临时禁用SSL验证(生产环境禁止):
    # pymongo示例
    client = pymongo.MongoClient(CONNECTION_STRING, ssl=False)
    
    # motor示例
    client = motor.motor_asyncio.AsyncIOMotorClient(CONNECTION_STRING, ssl=False)
    

5. 版本兼容性问题

模拟器版本与pymongo/motor版本不兼容可能引发异常:

  • 确保pymongo≥3.10、motor≥2.0(适配MongoDB API 3.6+)
  • 下载安装最新版CosmosDB模拟器,保持与客户端库版本匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:10:24