Channel
这一次看看channel
之前我就画过这个图。channel的作用就是从client向server发送请求。核心方法就是CallMethod。
然后请求到server的时候会被event dispatcher拿出来,然后调用Process,即切割数据并处理。
因为brpc是基于protobuf这个框架的,所以他的channel base是继承自protobuf的RpcChannel
Weight表示的是权重。不同类型的channel有不用的权重
而protobuf的RpcChannel的定义则更为简单
通过上面的注释我们也可以看出来是怎么使用的。method是调用的参数。request和response分别是参数和返回值
初始化会调用到InitSingle
在InitChannelOptions中根据选项去初始化一些参数。比如以前提到过的连接类型。确定Rpc协议
这有一个ComputeChannelSignature,应该是根据选项去生成一个唯一的signature。然后后续我们会把他和server_addr_and_port组合在一起,插入到socket map中
然后看一下核心的函数CallMethod
Controller中包含了选项以及额外的数据。如果done非空的话,done->Run会在请求结束后执行,否则请求则会被阻塞直到请求结束。对应了异步调用和同步调用
有几个要看的点
一个是controller里的call id,用来同步用的,等下我们会看到
还有一个是设置访问的方式。设置single server的server address以及server id。以及设置load balancer
然后通过serialize request进行序列化。把请求根据协议序列化到buffer中
最后通过IssueRPC来发起请求。
如果没有回调的话,就会通过Join来等待Rpc结束。否则的话就会直接返回,然后在请求返回的时候调用done->Run
看一下他的超时机制
如果有backup request的话,就会在backup request timer超时的时候调用HandleBackupRequest
如果有超时机制的话,就会调用HandleTimeout
这里会通过bthread_id_error调用处理函数。具体来说就是在call id这里
这里有handle socket failed
然后在下面的OnVersionedRPCReturned中,他会判断如果error code。并重新发起请求
文章评论