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

NestJS部署Cloud Run调用gRPC报RESOURCE_EXHAUSTED错误排查

Cloud Run部署NestJS GraphQL项目调用gRPC报RESOURCE_EXHAUSTED错误排查

问题场景

部署在Google Cloud Run的NestJS GraphQL项目,调用gRPC微服务时出现如下错误:

8 RESOURCE_EXHAUSTED: Received message larger than max (1013478509 vs 209715200)

本地运行完全正常,且发送的JSON请求体极小,尝试所有NestJS支持的gRPC数据格式、升级机器配置均无效。

相关代码片段:

@Injectable()
export class AdsStatisticsService implements OnModuleInit {
  adsStatService: StatService;
  constructor(@Inject('ADS_STATISTICS') private client: ClientGrpc) {}
  onModuleInit() {
    this.adsStatService = this.client.getService<StatService>('StatService');
  }
  insertAdsStat(request: InputInsert): Observable<string> {
    return this.adsStatService.insertAdsStat(request);
  }
}
// 请求内容
request = {advertisementId:1, views:100, date:1734337800000}

注:客户端与服务端的.proto文件内容一致,仅文件名不同。

可能原因及解决方案

1. gRPC客户端未配置足够的消息大小限制

gRPC默认最大接收消息大小为200MB(209715200字节),错误提示中收到的消息已超出该限制。即便请求体小,也可能是服务端返回的响应过大(比如错误堆栈、调试日志),或序列化/反序列化异常导致消息体积异常膨胀。

解决方案:
在NestJS的gRPC客户端配置中显式设置更大的消息大小限制:

@Module({
  providers: [
    AdsStatisticsService,
    {
      provide: 'ADS_STATISTICS',
      useFactory: () => {
        return ClientProxyFactory.create({
          transport: Transport.GRPC,
          options: {
            package: 'stat', // 替换为你的proto包名
            protoPath: join(__dirname, './path/to/your/proto/file.proto'),
            url: 'grpc-service-endpoint', // 替换为你的gRPC服务地址
            // 示例设置为500MB,可根据实际调整
            'grpc.max_receive_message_length': 500 * 1024 * 1024,
            'grpc.max_send_message_length': 500 * 1024 * 1024,
          },
        });
      },
    },
  ],
})
export class AdsStatisticsModule {}

2. Proto文件字段类型不匹配(序列化异常)

虽标注proto内容一致,仍需仔细校验字段类型定义。比如date字段:若服务端定义为Timestamp类型,客户端直接传入毫秒数(数字类型)会导致序列化异常,生成体积异常大的消息。

解决方案:
将客户端的date值转换为gRPC标准的Timestamp格式:

insertAdsStat(request: InputInsert): Observable<string> {
  // 将毫秒时间戳转换为gRPC Timestamp格式
  const seconds = Math.floor(request.date / 1000);
  const nanos = (request.date % 1000) * 1000000;
  const grpcRequest = {
    ...request,
    date: { seconds, nanos }
  };
  return this.adsStatService.insertAdsStat(grpcRequest);
}

3. 服务端返回异常大的响应

即便请求体小,服务端在处理错误时可能返回大量堆栈信息、调试日志,超出客户端默认限制。

解决方案:

  • 查看gRPC服务端日志,确认响应内容及大小;
  • 临时增大客户端消息限制,验证是否能正常接收响应,再针对性优化服务端返回内容。

4. Proto文件加载路径问题

客户端与服务端proto文件名不同,可能导致客户端加载的proto文件与预期不符(比如路径错误加载了旧版本proto),引发序列化异常。

解决方案:

  • 确认客户端proto文件的加载路径正确,确保加载的是与服务端一致的版本;
  • 统一客户端与服务端的proto文件名,避免路径解析歧义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:37:05