请求组件:
1. 线程池
2. 协程
3. 异步请求池
请求第三方服务:以mysql为例:
客户端send请求给业务服务器,业务服务器收到后进行解析,解析后调用mysql_query(sql)执行sql语句请求mysql服务器返回数据,这个请求mysql服务器请求时间很长,要等mysql服务器数据的返回才继续往下执行,否则就是阻塞状态。在单线程里面如果发多个请求,这些请求就是串行的,会很慢。
异步请求:每次发完请求后不等待结果的返回,直接去干其他的事情,用一个线程去专门接收mysql数据库的返回。这样就实现了异步。
实现:
1. 发送多个请求是一个IO还是多个IO?多个。
2. 如何接收服务器的返回值?单独开一个线程接收。
3. 接收结果的线程如何拿到对应数据要回传的fd?每次send完请求后就把fd与fd相对应的参数传到epoll里面,通过epoll_ctl添加到epoll里面。这个线程就是管理epoll。
4. 如何保证请求以及网络数据不丢失?
要实现四个接口(king式四元组):
1. commit:发送一个请求
a. 创建socket
b. 连接server
c. 准备对应的协议(redis/mysql)
d. send
e. 把fd加入到epoll(epoll_ctl)
2. thread_callback: 线程的回调函数
while(1) {
epoll_wait();
recv();
parser();
fd-->epoll delete
}
3. init:初始化
a. epoll_create
b. pthread_create
4. destroy
close(epfd);
pthread_cancel(thid);
DNS: 域名解析协议,从DNS服务器上拿到对应的ip地址,由N多个结点组成
UDP不连接也可以发送数据,但是连接有一个好处:能够提升后面send数据的成功概率(网络路径的探测包)
在返回结果的时候,可以在参数设置二级指针来进行返回,或者直接return返回。使用第一种比较好,可以有更大的自由度给程序员进行调度。
如何做成多个协议用同一个框架?可以做一个协议的回调函数,只需要传个参数。
当取回结果的时候,不同的返回值也要做不同的行为,也是定义一个结果的回调函数就可以。
redis有一种pipeline的模式,这种模式在一条连接上可以发多个请求,多个结果一起返回