服务器模型、服务器编程框架——Linux高性能服务器
服务器模型
C/S模型(客户端/服务器)
如图:
TCP/IP协议在设计和实现上并没有客户端和服务器的概念,在通信过程中所有机器都是对等的。但由于资源(视频、新闻、软件等)都被数据提供者所垄断
几乎所有的网络应用程序都很自然地采用了C/S 模型:所有客户端都通过访问服务器来获取所需的资源
特点
- 非对等服务,即客户端与服务器处于不对等地位
- 体现:服务器有软硬件资源及运算能力而客户端没有,服务器提供服务客户端请求服务
TCP服务器和TCP客户端工作流程
- 服务器可以同时监听多个请求:通过select系统调用实现
- 服务器在监听到请求后接收它并分配一个逻辑单元为新的连接服务【新建的子进程、子线程或其他】
应用
C/S模型适合资源相应集中的场所,实现简单
缺点
服务器是通信的中心,当访问量过大时,可能所有的客户端都得到很慢的响应【此时用P2P模型】
P2P模型(点对点)
相对C/S模型,更符合网络通信的实际情况,服务器不再是中心,让网络上所有主机回归到对等的地位
优:P2P模型使得每台机器在消耗服务的同时也给别人提供服务,这样资源能够充分、自由地共享。云计算机群可以看作P2P模型的一个典范
缺:当用户之间传输的请求过多时,网络的负载将加重
图a中主机之间很难互相发现。所以实际使用的P2P模型通常带有一个专门的发现服务器,这个发现服务器通常还提供查找服务(甚至提供内容服务),使每个客户都能尽快地找到自己需要的资源
从编程角度来讲,P2P模型可以看作C/S模型的扩展:每台主机既是客户端,又是服务器
服务器编程框架
服务器程序种类不同:其基本框架都一样,只是逻辑处理不同
服务器基本框架:
该基本框架可描述一台服务器或服务器机群
各部件功能、含义:
模块 | 单个服务器程序 | 服务器机群 |
---|---|---|
I/O处理单元 | 处理客户连接,读写网络数据 | 作为接入服务器,实现负载均衡 |
逻辑单元 | 业务进程/线程 | 逻辑服务器 |
网络存储单元 | 本地数据库、文件/缓存 | 数据库服务器 |
请求队列 | 各单元间通信方式 | 各服务器之间的永久TCP连接 |
I/O处理单元
- 对服务器:服务器管理客户连接的模块。它通常要完成以下工作:等待并接受新的客户连接,接收客户数据,将服务器响应数据返回给客户端。
数据的收发不一定在I/O处理单元中执行,也可能在逻辑单元中执行(具体在何处执行取决于事件处理模式)- 对一个服务器机群:I/O处理单元是一个专门的接入服务器。它实现负载均衡,从所有逻辑服务器中选取负荷最小的一台来为新客户服务
逻辑单元
- 对服务器:通常是一个进程或线程。它分析并处理客户数据,然后将结果传递给I/O处理单元或者直接发送给客户端(具体使用哪种方式取决于事件处理模式)
- 对服务器机群:一个逻辑单元本身就是一台逻辑服务器。服务器通常拥有多个逻辑单元,以实现对多个客户任务的并行处理
网络存储单元
- 它不是必须的,比如ssh、telnet 等登录服务就不需要这个单元
请求队列
- 对服务器:是各单元之间的通信方式的抽象。IO处理单元接收到客户请求时,需要以某种方式通知一个逻辑单元来处理该请求。同样,多个逻辑单元同时访问一个存储单元时,也需要采用某种机制来协调处理竞态条件(请求队列通常被实现为池的一部分)
- 对服务器机群:请求队列是各台服务器之间预先建立的、静态的、永久的TCP连接。这种TCP连接能提高服务器之间交换数据的效率,因为它避免了动态建立TCP连接导致的额外的系统开销