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

如何解决Ruby gRPC健康检查出现的NOTFOUND错误?

gRPC Ruby健康检查返回GRPC::NotFound错误解决方案

错误原因

该报错由Grpc::Health::Checker实例中未提前注册对应服务的健康状态导致:代码中在check方法内每次收到请求才实例化Checker,新实例无任何服务状态记录,无法匹配请求的服务参数,直接返回GRPC::NotFound错误。

解决方案

  • 调整Checker实例初始化时机:将Checker改为全局/类单例实例,在服务启动阶段完成初始化和服务状态注册,不要在请求处理逻辑中实例化
  • 保证注册服务名与请求参数一致:客户端请求时传入的service参数需要和注册时使用的服务名完全匹配,通用全局健康检查可注册空字符串为服务名
  • 可直接使用内置Checker作为服务,无需额外继承封装,减少冗余代码

正确代码示例

require 'grpc/health/v1/health_pb'
require 'grpc/health/checker'

# 服务启动阶段完成初始化和状态注册
health_checker = Grpc::Health::Checker.new
# 注册全局健康状态(对应service参数为空的请求)
health_checker.add_status('', Grpc::Health::V1::HealthCheckResponse::ServingStatus::SERVING)
# 按需注册单个服务的健康状态
health_checker.add_status('your.custom.service', Grpc::Health::V1::HealthCheckResponse::ServingStatus::SERVING)

# 若无需自定义健康检查逻辑,可直接将checker实例挂载到gRPC服务端,不需要自定义Service类
server = GRPC::RpcServer.new
server.handle(health_checker)
server.add_http2_port('0.0.0.0:50051', :this_port_is_insecure)
server.run

常见踩坑点

  • 动态实例化Checker:每次请求生成新的Checker实例,所有注册的状态都会丢失
  • 服务名不匹配:注册时使用完整服务名,客户端请求时仅传服务简称,导致匹配失败
  • 未注册空服务名:K8s等环境的gRPC健康探针默认会传入空字符串作为service参数,未注册该状态会直接返回NotFound

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:24:01