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
相关产品推荐
相关产品推荐

