baidu / sofa-pbrpc

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

sofa容错处理的疑问 #211

Closed scottzzq closed 6 years ago

scottzzq commented 6 years ago

在 sofa的wiki中写到容错策略: 一旦某个server的RPC调用出错,则将其加入“待探活队列”;

@@想问下这个出错的类型是否包括:应用层服务执行本身的错误(非RPC错误),具体就是指Server端在服务执行过程中遇到了错误,使用SetFailed(reason)接口设置错误的这种情况。 @qinzuoyan

谢谢!

qinzuoyan commented 6 years ago

包括。 参见代码:https://github.com/baidu/sofa-pbrpc/blob/master/src/sofa/pbrpc/dynamic_rpc_channel_impl.cc#L365

        if (cntl->Failed()) {
            server->is_last_request_succeed = false;
            if (server->is_in_live_map) {
                MoveToUnlive(server->server_address, cntl->Reason());
            }
        }
        else {
            server->is_last_request_succeed = true;
        }

可见通过判断cntl->Failed()来确定的。如果Server端通过SetFailed(reason)接口设置了错误,Client端在调用cntl->Failed()会返回true。

对于用户来说,有两种方式来设置失败:

  1. 调用SetFailed(reason),影响cntl->Failed()的结果;
  2. 将error放在Response Message中,这是业务层的数据,对RPC是透明的,不会影响cntl->Failed()的结果。

用户可以根据需要采用合适的方式,但是要清楚各自的影响。

scottzzq commented 6 years ago

多谢 @qinzuoyan 解答,非常感谢!