0

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

*编辑:感谢您的回复!我想这是我正在尝试做的更多事情。这主要是为了学习,所以我宁愿尽可能避免使用框架或库。以这个有点虚构的想法为例:有一个客户端程序,它执行某些功能并不断将输出流式传输到服务器(可能有很多这样的客户端),然后服务器创建统计数据并存储大部分数据。假设有一个可以登录服务器的管理客户端,如果有任何客户端将数据流式传输到服务器,它反过来会将数据流式传输到每个连接的管理客户端。这就是我对服务器程序逻辑的设想:服务器将有 3 个线程用于管理传入连接(每个端口监听一个),然后生成一个线程来管理每个连接:

当数据从客户端传入服务器时,服务器会解析相关内容并将该数据放入队列中,比如说 adminDataQueue。反过来,有一个线程监视这个队列,每 200 毫秒(或其他)会检查队列以查看是否有数据,如果有,则循环通过 AdminDataConnections 并将其发送给每个。

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

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

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

4

1 回答 1

2

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

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

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

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

于 2009-09-28T17:53:34.980 回答