2021SC@SDUSC BRPC代码分析(十四) —— 向Server写数据,channel详解

2021SC@SDUSC


一、简介

        上篇文章结合echo服务器端介绍了一下server是怎么被创建的,接下来我们看看建立连接之后怎么发送数据。
        上篇文章也用到了这张图,中间的channel就是我们今天要讲解的内容。之后会再对数据的传输做更详细的解读。
在这里插入图片描述
首先,channel是什么?
channel,通道也可以叫管道。它可以同时进行读写,而流只能读或者只能写,通道(Channel)是双向的,可以读操作,也可以写操作。
通道可以实现异步读写数据。
通道可以从缓冲读数据,也可以写数据到缓冲。
我们看到下面的client.cpp中,正是用到的channel实现数据交互。在这里,通道表示客户端到服务器的通信线路。
既然是通信,就一定会有Server服务器端和Client客户端,这篇文章将结合代码,宏观的看一下,我们建立一个服务器端,到底发生了什么。(本次介绍所有内容基本位于server.cpp)
所以我们这篇文章对通道做简单分析。

二、代码分析

首先是channel的基类,可以看出所有的channel都基于protobuf的RpcChannel和Describable,有两个需要被实现的函数,Weight()代表当前Channel的权重,CheckHealth()健康检查。之所以成为虚函数是因为channel有多种形式,比如SelectiveChannel、PartitionChannel等。
在这里插入图片描述
然后又实现ChannelOptions类,对channel的可选项进行汇总。
比如connect_timeout_ms是连接超时,注意这个超时时间是rpc框架内部的连接超时。
timeout_ms控制的是一次rpc请求的超时。
注释都非常详细,不再一一列举了。
在这里插入图片描述
在channel.cpp中给出了默认使用的参数。
在这里插入图片描述
然后看channel的初始化。同样是重载了多个版本,都是调用到InitSingle()。
在这里插入图片描述
重点内容在这里。GlobalInitializeOrDie()执行协议和负载均衡方法注册之类的操作,全局只需要执行一次。随后将这个server_addr_and_port插入到socketmap里并将对应的socket_id保存到_server_id里供后续使用,socketmap保存某IP+port到socket_id的对应关系。
在这里插入图片描述
然后就是最重要而且最核心的CallMethod方法。所有涉及管道的操作最后都会在这里调用这个函数完成。每一次请求都会绑定一个controller,首先根据传入属性等初始化cntl,随后设定协议和重试机制,后续的操作基本围绕它展开。
在这里插入图片描述
随后是针对此次请求的controller进行相关赋值,主要分为两部分,一是各个超时参数如果未设置,就使用_options的参数,比较特别的是连接超时,正如注释所说,由于连接是各个rpc调用经常重复使用的,单独为cntl设置没有意义,因此直接使用_options里的。二是这次请求实际内容相关的response、打包函数、调用的方法等。
在这里插入图片描述
接下来设置timer和当前请求完成的_deadline_us,超时和backup_request_ms等都需要用到timer。分为三种情况,一是backup_request_ms设置有效的情况,二是没有有效backup_request_ms但是有有效timeout_ms地情况,三是二者皆无的情况。
第一种情况会用HandleBackupRequest设置一个用于backup_request的bthread_timer,也就是到了多久后会发起backup请求,也会利用timeout_out形成deadline_us。(这个Handle和下一个Handle都属于系统调用的范畴)
在这里插入图片描述
第二种只有超时,使用HandleTimeout作为设置bthread_timer和deadline_us,到点后需要处理超时。
在这里插入图片描述
当所有内容设置完后。就可以提交传输了。利用的是cntl->IssueRPC(),这个函数在分析controller的时候会再详细解释。这个最核心的方法其实就是通过对各种设置内容的处理,最终在完成一个请求的发送。
在这里插入图片描述
最后是实现基类的那两个方法,这只是一个普通的channel类。
Weight在controller有lb的时候会得到他的值,否则是0.也就是当前Channel连接的所有server的和。
普通Channel的CheckHealth()是通过判断对应的_lb是否能连接到有效的server实现的。
在这里插入图片描述

总结

以上就是今天介绍的全部内容,本文主要结合如何发送数据对channel进行详细源码分析,之后的博客会继续进行其他代码的分析。

猜你喜欢

转载自blog.csdn.net/m0_46306466/article/details/122179340