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

Azure Cosmos DB模拟器在API测试中不稳定的问题排查

解决方案:提升Azure Cosmos DB模拟器稳定性+实现测试用干净数据库

一、优化模拟器容器配置

1. 分配足够资源

Linux版Cosmos模拟器对CPU和内存有一定要求,资源不足是导致无响应的常见原因。在docker-compose.yml中添加资源限制/预留:

cosmosdb:
  # ... 原有配置
  deploy:
    resources:
      limits:
        cpus: '2.0'
        memory: 4G
      reservations:
        cpus: '1.0'
        memory: 2G
  # 若环境不支持deploy语法,改用旧版参数:
  # mem_limit: 4G
  # cpus: '2.0'

2. 改进健康检查逻辑

原健康检查仅验证证书获取,无法准确反映模拟器是否能处理请求。替换为调用官方就绪状态接口,并放宽检查阈值:

healthcheck:
  test: ["CMD", "curl", "-f", "-k", "https://localhost:8081/_explorer/emulatorstatus"]
  interval: 15s
  timeout: 5s
  retries: 10

3. 配置干净测试环境

  • 若每次测试需要全新数据库,将AZURE_COSMOS_EMULATOR_ENABLE_DATA_PERSISTENCE设为false,容器重启后自动清空所有数据。
  • 若需偶尔保留数据调试,临时设为true即可。同时添加禁用遥测的参数减少后台开销:
environment:
  - AZURE_COSMOS_EMULATOR_PARTITION_COUNT=10
  - AZURE_COSMOS_EMULATOR_ENABLE_DATA_PERSISTENCE=false
  - AZURE_COSMOS_EMULATOR_DISABLE_TELEMETRY=true
  - AZURE_COSMOS_EMULATOR_IP_ADDRESS_OVERRIDE=0.0.0.0

二、优化客户端代码

1. 更可靠的就绪检测

原readAll()无法验证模拟器是否能处理CRUD操作,替换为底层账户检测+临时数据库验证:

async function isDbReady(): Promise<boolean> {
  try {
    // 先验证服务连通性
    await client.getDatabaseAccount();
    // 验证CRUD操作可用性
    const testDb = client.database('temp-health-check-db');
    await testDb.createIfNotExists();
    await testDb.delete();
    return true;
  } catch (err) {
    console.log('database not ready', err.message);
    return false;
  }
}

2. 增强客户端重试策略

针对模拟器偶尔的资源节流/超时,调整客户端重试参数:

const client = new CosmosClient({
  endpoint: `https://cosmosdb:8081/`,
  key: 'C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==',
  connectionPolicy: { 
    requestTimeout: 15000,
    retryOptions: {
      maxRetryAttemptsOnThrottledRequests: 5,
      maxRetryWaitTimeInSeconds: 30
    }
  },
});

三、测试流程优化

  1. 每次测试前重置容器:在测试脚本开头执行以下命令,确保模拟器是全新状态:
docker-compose stop cosmosdb && docker-compose rm -f cosmosdb && docker-compose up -d cosmosdb

配合AZURE_COSMOS_EMULATOR_ENABLE_DATA_PERSISTENCE=false,彻底避免残留数据影响。

  1. 限制测试并行度:若并行测试导致模拟器资源耗尽,改为串行执行或限制并行数;也可给每个测试分配独立的数据库名,测试完成后自动删除,避免冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 14:40:24