baidu / sofa-pbrpc

A light-weight RPC implement of google protobuf RPC framework.
Other
2.13k stars 655 forks source link

resolve address failed的问题 #104

Closed zd-double closed 8 years ago

zd-double commented 8 years ago

问题现象

最近在线上环境一些依赖sofa-pbrpc的服务出现"resolve address failed"的问题,导致client和一些server不能正常通信。

问题原因

如 #37 中描述:RpcChannel在构造函数中调用具体实现channel的Init()函数对地址进行解析不能返回Init的结果,当地址解析失败会设置_resolve_address_succeed的状态,在之后每次RpcChannel的CallMethod都会检查_resolve_address_succeed状态,如果为false则返回用户失败并设置RPC_ERROR_RESOLVE_ADDRESS的错误码。

解决方案

  1. 应用程序在rpc调用CallMethod失败后(simple_rpc_channel_impl.cc 139行),根据RPC_ERROR_RESOLVE_ADDRESS的错误码,重新创建channel,对地址重新解析。 优点:不用修改rpc的接口和实现,用户自己控制地址解析失败的处理逻辑。 缺点:当前一些服务需要增加针对RPC_ERROR_RESOLVE_ADDRESS错误的处理逻辑对地址重新解析。
  2. 在RpcChannel中增加类似IsValid()的接口返回channel是否Init成功,用户创建完channel调用,根据结果再进行相关操作。 优点:如果地址解析失败,在channel创建后就可以判断到,进而重新创建channel。 缺点:需要依赖rpc的服务在创建channel后调用新增接口进行判断并处理。
  3. 在RpcChannel的CallMethod中判断地址解析失败的状态后(simple_rpc_channel_impl.cc 131行),重新解析一遍地址。 优点:当前依赖rpc的服务不需要升级。 缺点:地址解析是个同步过程,在CallMethod中调用地址解析可能阻塞用户线程。没有让用户选择处理方式。

@qinzuoyan @cyshi 左言和承毅对这个问题有什么方案吗?

cyshi commented 8 years ago

@qinzuoyan 看看 我觉得几种方案都不是很合适


ChannelOption 中增加一个选项 bool createWithInit 默认true 进行初始化 兼容老代码

程序运行中出错的话 需要用户自己处理 重新init或者退出