本文同步与Linux高性能服务器编程模式 | Rust中文社区 本文时间:2018-11-21,作者:krircc, 简介:天青色
欢迎向Rust中文社区投稿,投稿地址,好文将在以下地方直接展示
高性能服务器至少要满足如下几个需求:效率高:既然是高性能,那处理客户端请求的效率当然要很高了
高可用:不能随便就挂掉了
编程简单:基于此服务器进行业务开发需要足够简单
可扩展:可方便的扩展功能
可伸缩:可简单的通过部署的方式进行容量的伸缩,也就是服务需要无状态
而满足如上需求的一个基础就是高性能的IO!
讲到高性能IO绕不开Reactor模式,它是大多数IO相关组件如Netty、Redis在使用的IO模式
几乎所有的网络连接都会经过读请求内容——》解码——》计算处理——》编码回复——》回复的过程
Socket
Socket之间建立链接及通信的过程!实际上就是对TCP/IP连接与通信过程的抽象:服务端Socket会bind到指定的端口上,Listen客户端的"插入"
客户端Socket会Connect到服务端
当服务端Accept到客户端连接后
就可以进行发送与接收消息了
通信完成后即可Close
阻塞IO(BIO)、非阻塞IO(NBIO)、同步IO、异步IO一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作
阻塞IO和非阻塞IO的区别在于第一步:发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO;如果不阻塞,那么就是非阻塞IO
同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO,因此阻塞IO、非阻塞IO、IO复用、信号驱动IO都是同步IO;如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO
BIO优点模型简单
编码简单
BIO缺点性能瓶颈低
缺点:主要瓶颈在线程上。每个连接都会建立一个线程。虽然线程消耗比进程小,但是一台机器实际上能建立的有效线程有限,且随着线程数量的增加,CPU切换线程上下文的消耗也随之增加,在高过某个阀值后,继续增加线程,性能不增反降!而同样因为一个连接就新建一个线程,所以编码模型很简单!
就性能瓶颈这一点,就确定了BIO并不适合进行高性能服务器的开发!
NBIO:Acceptor注册Selector,监听accept事件
当客户端连接后,触发accept事件
服务器构建对应的Channel,并在其上注册Selector,监听读写事件
当发生读写事件后,进行相应的读写处理
优点性能瓶颈高
缺点模型复杂
编码复杂
需处理半包问题
NBIO的优缺点和BIO就完全相反了!性能高,不用一个连接就建一个线程,可以一个线程处理所有的连接!相应的,编码就复杂很多,从上面的代码就可以明显体会到了。还有一个问题,由于是非阻塞的,