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模拟器的自签名证书信任可能间歇性失效,尤其是系统更新或模拟器重启后:
- 手动导入证书到信任存储:
- 点击右下角CosmosDB模拟器托盘图标,选择「导出SSL证书」,保存到默认路径(
C:\Users\<你的用户名>\Documents\Azure Cosmos DB Emulator\certificates) - 右键证书文件→「安装证书」,选择「当前用户」,下一步
- 选择「将所有证书放入下列存储」,点击「浏览」,选择「受信任的根证书颁发机构」完成导入
- 点击右下角CosmosDB模拟器托盘图标,选择「导出SSL证书」,保存到默认路径(
- 连接时显式指定证书路径:
在客户端初始化时添加证书路径参数,避免验证异常:# 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进程资源占用,若持续过高:- 右键托盘图标→「停止」,等待服务停止后再「启动」
- 进入模拟器设置(托盘图标→Settings),降低内存配额
- 关闭其他高资源占用程序,释放系统资源
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
相关产品推荐
相关产品推荐

