一 传统阻塞线程模型
第一:服务器端有一个Acceptor线程接收客户端请求
第二:Acceptor接收到每一个客户端请求后,为每一个线程分配一个线程处理客户端请求
缺点:
第一:当数据量很大或者客户端很多的时候,就会创建大量的线程对象
第二:连接建立后,没有数据可读,会一直处于阻塞状态
二 Reactor单线程模型
第一:Reactor对象通过Selector(多路复用器)监控客户端请求事件
第二: 收到事件后,进行分发
第三:如果是建立连接的事件则交给Acceptor,通过accept处理连接请求,然后创建一个Handler对象处理连接完成后的后续业务处理;如果不是建立连接则直接调用Handler来处理
缺点:
单个线程要负责连接、读写请求,如果客户端连接数量太多,则会无法发挥CPU多核的性能,容易造成性能瓶颈
三 Reactor多线程模型
第一:Reactor线程通过Selector多路复用器监听客户端事件
第二:收到事件后,进行转发
第三:如果是建立连接的请求,则通过Acceptor线程的accept处理连接,然后创建一个Handler对象处理后续的请求;如果不是连接请求则由Reactor分发,调用Handler来处理
第四:Handler不会自己处理具体的读写请求,而是直接提交给一个线程池去执行,然后就可以返回了,然后由线程池获取一个线程执行这个请求
优点:
可以充分利用多核CPU处理能力
缺点:
Reactor要处理所有的事件监听和响应,是单线程运行,并发量大的时候,容易出现性能瓶颈
四 主从Reactor多线程模型
第一:MainReactor通过通过多路复用器,监听客户端连接请求,然后调用Acceptor的accept处理连接请求
第二:Acceptor处理连接事件,然后Main Reactor将连接分配给SubReactor
第三:SubReactor将连接加入到连接队列并监听,然后创建Handler处理各种事件
第四:Handler不处理具体的业务逻辑,而是将请求或者事件提交给线程池去处理
第五:线程池分配线程处理业务逻辑,并返回结果