一、项目介绍以及前置知识介绍

目录

仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器

HTTP服务器概念

Reactor模型

单Reactor单线程:单I/O多路复用+业务处理

单Reactor多线程:单I/O多路复用+线程池(业务处理)

多Reactor多线程:多I/O多路复用+线程池(业务处理)


仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器

通过该项目实现的高并发服务器组件可以简洁快速的完成一个高性能服务器的搭建。并且通过组件內提供的不同应用层协议支持,也可以快速完成一个高性能应用服务器的搭建(该项目实现的组件只提供了对HTTP协议的支持)。

在这里要明确的是,该项目实现的是一个高并发服务器组件,因此当前项目中并不包含实际的业务内容!

为了完成该项目需要对一些前置知识有一定的了解,接下来我会一一对不同的前置内容做出解释。

HTTP服务器概念

HTTP(Hyper Text Transfer Protocol),超文本传输协议是一个应用层协议,是一种简单的请求-响应协议(客⼾端根据自己的需要向服务器发送请求,服务器针对请求提供服务,完毕后通信结束)。关于HTTP协议如果有不了解的可以先通过书籍或互联网进行学习,笔者后续会写一个关于HTTP协议的博客,链接后面会添加进来。需要注意的是HTTP协议是一个运行在TCP协议之上的应用层协议,这一点本质上是告诉我们,HTTP服务器其实就是个TCP服务器,只不过在应用层基于HTTP协议格式进行数据的组织和解析来明确客户端的请求并完成业务处理。

因此实现HTTP服务器简单理解,只需要一下几步即可

        1.搭建一个TCP服务器,接受客户端请求。

        2.以HTTP协议格式进行解析请求数据,明确客户端目的。

        3.明确客户端请求目的后提供对应的服务。

        4.将服务结果以HTTP协议格式进行组织,发送给客户端。

实现一个HTTP协议服务器很简单,但是实现一个高性能的服务器并不简单,接下来将讲解基于Reactor模式的高性能服务器实现。

当然准确来说,因为该项目要实现的服务器本身并不存在业务,所以要实现的算是一个高性能服务器基础库,是一个基础组件。

Reactor模型

概念: Reactor模式是指,通过一个或多个输入同时传递给服务器进行请求处理时的事件驱动处理模式。服务端程序处理传入多路请求,并将它们同步分派给请求对应的处理线程,Reactor模式也叫Dispatcher模式。

简单理解就是使用I/O多路复用统一监听事件,收到事件后分发给处理进程或线程,是编写高性能网络服务器的必备技术之一。

分类:

单Reactor单线程:单I/O多路复用+业务处理

1.通过IO多路复用模型进行客户端请求监控

2.触发事件后,进行事件处理

        a. 如果是新建连接请求,则获取新建连接,并添加至多路复用模型进行事件监控。

        b. 如果是数据通信请求,则进行对应数据处理(接受数据,处理数据,发送响应)。

优点:所有操作均在同一线程中完成,思想流程较为简单,不涉及进程或线程间通信及资源争抢问题。

缺点:无法有效利用CPU多核资源,很容易到达性能瓶颈。

适用场景:适用于客户端数量较少,且处理速度较为快速的场景。(处理较慢或活跃连接较多,会导致串行处理的情况下,后处理的连接长时间无法得到响应)。

单Reactor多线程:单I/O多路复用+线程池(业务处理)

1.Reactor线程通过I/O多路复用模型进行客户端请求监控

2.触发事件后,进行事件处理

        a. 如果是新建连接请求,则获取新建连接,并添加至多路复用模型进行事件监控。

        b. 如果是数据通信请求,则接收数据后分发给Worker线程池进行业务处理。

        c. 工作线程处理完毕后,将响应交给Reactor线程进行数据响应。

优点:充分利用CPU多核资源,处理效率可以更高,降低了代码的耦合度

缺点:在单个Reactor线程中,包含了对所有客户端的事件监控,以及所有客户端的IO操作,不利于高并发场景(每一个时刻都有很多客户端连接)来不及进行新的客户端连接处理

多Reactor多线程:多I/O多路复用+线程池(业务处理)

基于单Reactor多线程缺点考虑,如果有IO的时候又有连接来则无法处理,因此将连接处理单独拿出来,也就是说让一个Reactor线程仅仅进行新连接的处理,让其他Reactor线程进行IO处理,IO Reactor线程拿到数据分发给业务线程池进行业务处理。因此多Reactor多线程模式也叫做主从Reactor模式。

主Reactor线程:进行新连接事件监控

从属Reactor线程:进行IO事件监控

业务线程池:进行业务处理

1.在主Reactor中处理新连接请求事件,有新连接到来则分发到Reactor中监控

2.在子Reactor中进行客户端通信监控,有事件触发,则接受数据分发给Worker线程池

3.Worker线程池分配独立的线程进行具体的业务处理

         a. 工作线程处理完毕后,将响应交给子Reactor线程进行数据响应

优点:充分利用CPU多核资源,并且可以进行合理分配,主从Reactor各司其职

注意:执行流并不是越多越好,因为执行流多了,反而会增加CPU切换调度的成本。所以在有些主从Reactor模式中,将业务处理放在从属Reactor线程中完成,此时的从属Reactor线程既进行IO操作,又进行业务处理。

项目目标定位:One Thread One Loop主从Reactor模型高并发服务器

 该项目要实现的是主从Reactor模型服务器,也就是主Reactor线程仅仅监控监听描述符,获取新建连接,保证获取新连接的高效性,提高服务器的并发性能。

主Reactor获取到新连接后分发给子Reactor进⾏通信事件监控。而子Reactor线程监控各自的描述符的读写事件进行数据读写以及业务处理。

One Thread One Loop的思想就是把所有的操作都放到⼀个线程中进行,⼀个线程对应⼀个事件处理的循环。 当前实现中,因为并不确定组件使用者的使用意向,因此并不提供业务层工作线程池的实现,只实现主从Reactor,而Worker⼯作线程池可由组件库的使用者的需要自行决定是否使⽤和实现。

  • 18
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值