设计大规模服务器程序的最常用方法是什么?

时间:2009-09-28 17:39:21

标签: scalability server-side

好的,我知道这是相当广泛的,但让我稍微缩小一点。我已经完成了一些客户端 - 服务器编程,但没有什么比一次只能处理几个客户端更多。所以我想知道设计方面对这些服务器最主流的方法是什么。如果人们可以参考教程,书籍或电子书。 哈哈,好的。并没有真正缩小范围。我想我正在寻找的是一个简单但文字的例子,说明如何设置服务器端程序。 我看到它的方式:客户端发送命令:服务器接收命令并放入队列,服务器有一个专用线程或一个不断轮询该队列的线程池,然后将适当的响应发送回客户端。是否经常使用非阻塞I / O? 我想我只需要教程,时间和练习。

*编辑:感谢您的回复!以下是我想要做的更多内容。 这主要是为了学习,所以我宁愿尽可能地避免使用框架或库。以这个有点构思的为例: 有一个客户端程序它可以执行某些功能并不断地将输出流式传输到服务器(可能有许多这样的客户端),然后服务器创建统计信息并存储大部分数据。并且假设有一个管理客户端可以登录到服务器,如果有任何客户端将数据流式传输到服务器,它反过来会将该数据流式传输到连接的每个管理客户端。 这就是我设想的服务器程序逻辑: 服务器将有3个线程用于管理传入连接(每个端口监听一个)然后生成一个线程来管理每个连接: 1)ClientConnection基本上只接收输出,我们只会说是文本 2)AdminConnection,用于在服务器和管理客户端之间发送命令 3)AdminDataConnection,主要用于将客户端输出流式传输到管理客户端

当数据从客户端进入服务器时,服务器解析相关的内容并将该数据放入队列中,让我们说adminDataQueue。反过来,有一个Thread监视这个队列,每隔200ms(或其他)会检查队列是否有数据,如果有,则循环通过AdminDataConnections并将其发送给每个队列。

现在,对于AdminConnection,这将适用于任何命令或数据的直接请求。因此,您可以请求统计信息,服务器端将收到统计信息命令,然后发送一个命令说明传入的统计信息,然后立即发送统计信息对象或数据。

对于AdminDataConnection,它只是来自客户端的输出,可能有几个简单的命令交织在一起。

除了将所有客户端数据的逻辑问题的带宽问题汇集到每个管理客户端之外。由于扩展问题,这种设计会产生什么样的问题(再次忽略客户端和服务器之间的带宽;以及管理客户端和服务器。

1 个答案:

答案 0 :(得分:2)

有几种基本方法可以做到这一点。

  • 工作线程或进程。 Apache在其大多数多处理模式中都会这样做。在某些版本中,当请求到达时,会为每个请求生成一个线程或进程;在其他版本中,有一个等待线程池,在它到达时分配工作(避免在请求到达时fork / thread创建开销)。
  • 异步(非阻塞)I / O和事件循环。这基本上是使用UNIX select调用(尽管FreeBSD和Linux都提供了更优化的替代方案,例如kqueue)。 lighttpd使用此方法并且能够实现非常高的可伸缩性,但任何服务器内计算都会阻止所有其他请求。并发动态请求处理被传递到单独的进程(通过CGI)或等待进程(通过FastCGI或其等价物)。

我没有任何特别的参考资料可以指向您,但是如果您使用不同的方法查看开源项目的网站以获取有关其设计的信息,那将不是一个糟糕的开始。

根据我的经验,从头开始工作时,构建工作线程/流程设置会更容易。但是,如果您有一个完全与其他通信任务(例如数据库查询)集成的良好异步框架,它可以非常强大,并使您从一些(但不是全部)线程锁定问题中解脱出来。如果您使用的是Python,Twisted就是这样一个框架。我最近一直在使用Lwt为OCaml取得了成功。