异步请求池

请求组件:
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的模式,这种模式在一条连接上可以发多个请求,多个结果一起返回

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值