2009-09-28 80 views
0

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

*编辑:谢谢你的回应!这里有一点我想要做的,我想。 这主要是为了学习的目的,所以我宁愿尽量避免使用框架或库。举个例子,这有点弥补的想法: 有一个客户端程序,它执行一些功能,并不断将输出流传输到服务器(可以有很多这些客户端),服务器然后创建统计信息并存储大部分数据。并且假设有一个可以登录到服务器的管理客户端,并且如果有客户端正在将数据流式传输到服务器,则它会将该数据传输到每个连接的管理客户端。 这是我的设想服务器程序逻辑: 服务器将具有3个线程,用于管理传入连接(每个端口一个监听),则产生线程管理每个连接: 1)ClientConnection这将基本上只是接收输出,我们只能说是文本 2)AdminConnection这将是服务器和管理客户机之间发送命令 3)AdminDataConnection这将主要是用于客户端的输出流来管理客户端

当数据从客户端进来到服务器,服务器解析什么是相关的,并将这些数据放入队列中让我们说adminDataQueue。反过来,有一个线程监视这个队列,每隔200ms(或其他)检查队列,看看是否有数据,如果有的话,然后遍历AdminDataConnections并将其发送给每个队列。现在

的AdminConnection,这将是任何命令或数据的直接请求。因此,您可以请求统计数据,服务器端将接收统计数据的命令,然后发送一条说明传入统计数据的命令,然后立即发送统计数据或统计数据。

至于AdminDataConnection,它仅仅是从客户端的输出交织在一起,也许一些简单的命令。

从所有的客户端数据的逻辑问题的带宽问题

除了被漏斗一起给每个管理员客户端。会从这样的设计出现什么样的问题,是由于缩放问题(再次忽略客户端和服务器之间的带宽;管理客户端和服务器

+0

你能写出一个用户故事,以更好地缩小它。这听起来像你不是在谈论一个Web应用程序,而是你自己在写服务器的地方。 – 2009-09-28 17:41:57

+0

就像电锯没有必要比钢锯更好?你是否知道数据的性质(更像是银行交易,你可能会丢失数据,或者更像是你不太在意的游戏交易),吞吐率,响应时间等。 也许,最好的细节是给我们你简短的具体用例。 – 2009-09-28 18:02:44

+0

我可以把你指向我的书,但那将是一个完全无耻的插件。 – mtnygard 2009-09-28 22:07:40

回答

2

有几个基本的方法来这样做

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

我没有任何特别的引用方便您指出,但是如果你看看网站上的开源项目,使用不同的方法获取他们设计的信息并不是一个糟糕的开始。

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

相关问题