Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scalability 设计大型服务器程序最常用的方法是什么?_Scalability_Server Side - Fatal编程技术网

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

Scalability 设计大型服务器程序最常用的方法是什么?,scalability,server-side,Scalability,Server Side,好的,我知道这是相当广泛的,但让我缩小一点。我做了一点客户机-服务器编程,但没有什么比一次只处理两个客户机更需要的了。所以我想知道,从设计角度来看,这些服务器最主流的方法是什么。如果人们可以参考教程、书籍或电子书。 哈哈,好的。并没有真正缩小范围。我想我要找的是一个简单但文字化的服务器端程序设置示例。 在我看来:客户机发送命令:服务器接收命令并放入队列,服务器有一个专用线程或线程池,该线程池不断轮询该队列,然后将相应的响应发送回客户机。是否经常使用非阻塞I/O? 我想我需要的只是教程、时间和练习

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

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

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

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

至于AdminDataConnection,它只是客户机的输出,可能有几个简单的命令交织在一起


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

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

  • 工作线程或进程。Apache在其大多数多处理模式下都会这样做。在某些版本中,当请求到达时,会为每个请求生成一个线程或进程;在其他版本中,会有一个等待线程池,这些线程在请求到达时会被分配工作(避免请求到达时的叉/线程创建开销)
  • 异步(非阻塞)I/O和事件循环。这基本上是使用UNIX
    select
    调用(尽管FreeBSD和Linux都提供了更优化的替代方案,如
    kqueue
    )。使用此方法并能够实现非常高的可扩展性,但任何服务器内计算都会阻止所有其他请求。并发动态请求处理会传递给单独的进程(通过CGI)或等待进程(通过FastCGI或其等效程序)
我手头没有任何特别的参考资料可供您参考,但如果您查看开放源码项目的网站,使用不同的方法获取有关其设计的信息,这将是一个不错的开始


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

您能写一个用户故事来更好地缩小它的范围吗?听起来您不是在谈论web应用程序,而是在自己编写服务器的地方。就像链锯一样,没有必要更好你们知道数据的本质吗(是更像银行交易,你们可能会丢失数据,还是更像游戏交易,你们不太在乎),吞吐率,响应时间等。也许,最好的细节是给我们简单的特定用例。我可以告诉你我的书,但那将是一个完全无耻的插件。