Socket: 服务器设计

编程入门 行业动态 更新时间:2024-10-10 02:21:05

Socket: <a href=https://www.elefans.com/category/jswz/34/1771423.html style=服务器设计"/>

Socket: 服务器设计

以下内容引述至《Linux/Unix系统编程手册》

迭代型和并发型服务器

对于使用Socket的网络服务器程序,有两种常见的设计形式:

  • 迭代型:服务器每次只处理一个客户端,只有当完全处理完一个客户端的请求后采取处理下一个客户端;
  • 并发型:这种类型的服务器被设计为能够同时处理多个客户端的请求

迭代性服务器通常只使用与能够快速处理客户端请求的场景,因为每个客户端都必须先等待,知道前面所有的客户端都处理完了服务器才能继续服务下一个客户端。迭代型服务器的典型应用场景是当客户端和服务器之间交换单个请求和响应时。

并发型服务器适用于对每个请求都需要大量处理时间,或者是当客户端和服务器在进行扩展对话中需要来回传递消息的场景。

并发型服务器的其他设计方案

对于高负载的服务器来说,为每个客户端创建一个新的子进程(甚至是线程)所带来的开销对服务器来说是个沉重的负担,因此需要有其他的方案

在服务器上预先创建进程或线程

预先创建进程或者线程的服务器,其核心理念有以下几点:

  • 服务器程序在启动阶段(即在任何客户端请求到来之前)就立刻预先创建好一定数量的字进程(或线程),而不是针对每个客户端来创建一个新的子进程(或线程)。这些子进程构成了一种服务池;
  • 服务池中的每个子进程一次只处理一个客户端。在处理完客户端请求后,子进程并不会终止,而是获取下一个待处理的客户端继续处理,如此类推

根据以上描述,服务池中的子进程必须遵循某些协议,使得它们能以独占的方式选择一个客户端连接。在大多数UNIX实现中,让服务池中的每个子进程在监听描述符的accept()调用上阻塞即可。即:服务器父进程在创建任何子进程之前先创建监听套接字,然后每个子进程在fork()调用中继承该套接字的文件描述符。当一个新的客户端连接到来时,只有其中一个子进程能完成accept()调用。

在单个进程中处理多个客户端

我们可以设计让单个服务器进程来处理多个客户端。为了实现这点,我们必须采用一种能允许单个进程同时监视多个文件描述符上I/O事件的I/O模型(I/O多路复用、信号驱动I/O或者epoll)
在设计单进程服务器时,服务器进程必须做一些通常由内核来处理的调度任务。在每个客户端一个服务器进程地解决方案中,我们可以依靠内核来确保每个服务器进程(从而也确保了客户端)

采用服务器集群

其他用来处理高客户端负载的方法还包括使用多个服务器系统——服务器集群
构建服务器集群最简单的一种方法是DNS轮转负载共享,一个地区的域名权威服务器将同一域名映射到多个IP地址上(即多个服务器共享同一个域名)
DNS循环轮转的优势是成本低,而且容易实施。缺点是需要考虑保持良好的负载均衡或者是确保高可用性的机制,另一个我们需要考虑的因素是服务器亲和性,确保同一个客户端的请求全部定向到同一台服务器上。
解决方案是服务器负载均衡。在这种场景下,由一台负载均衡服务器将客户端请求路由到服务器集群中的其中一个成员上。这消除了由远端DNS缓存所引起的问题,因为服务器集群只对外提供了一个单独的IP地址。负载均衡服务器结合一些算法来衡量或计算服务器负载,并智能化地将负载分发到集群中的各个成员之上。负载均衡服务器也会自动检测集群中的各个成员之上。负载均衡服务器也会自动检测集群中失效的成员。最后,负载均衡服务器可能还会对服务器亲和力的支持。

inetd 守护进程

在/etc/ervices文件中,可以看到列出了数百个不同的服务项目。这暗示了一个系统理论上可以运行数量庞大的服务器进程。这些大量的进程占据系统的内存和交换空间ÿ

更多推荐

Socket: 服务器设计

本文发布于:2024-03-23 20:49:49,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1742675.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:服务器   Socket

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!