如何处理与端口的突发连接?

How to handle a burst of connection to a port?

我已经使用 Python(asyncore 和套接字)构建了一个监听服务器上特定端口的服务器,我很想知道当有太多人连接时是否可以做任何事情立即在我的服务器上。

代码本身无法更改,但添加更多进程是否可行?还是从硬件的角度来看,我应该专注于在前面添加一个负载平衡器并在多个服务器上平衡请求?

这个问题是 Whosebug (code/python) 和 ServerFault(服务器管理)的边界问题。由于代码原因,我决定使用 SO,但如果您认为 ServerFault 更好,请告诉我。

1。 asyncore 依赖于操作系统来处理整个连接,因此你要问的是 OS 依赖。和Python关系不大。使用 twisted 而不是 asyncore 不会解决您的问题。 例如,在 Windows 上,您只能侦听同时进入的 5 个连接。 所以,第一个要求是,运行 它在 *nix 平台上。 其余取决于您的处理程序花费多长时间以及您的带宽。

2。 你可以做的是结合异步和线程来加速等待下一个连接。 IE。您可以在单独的线程中创建 运行ning 的处理程序。这会有点混乱,但它是可能的解决方案之一。 当服务器接受一个连接时,不是创建新的传统处理程序(这会减慢检查后续连接的速度——因为 asyncore 会等到该处理程序至少完成它的一部分工作),而是创建一个处理读写的处理程序非阻塞。 IE。它启动一个线程并完成工作,然后,当它准备好数据时,只有在遵循 loop() 的检查后才发送它。 这样,您可以让 asyncore.loop() 更频繁地检查服务器的套接字。

3。 或者您可以使用两个不同的 socket_maps 和两个不同的 asyncore.loop()。 您使用一个地图(字典),比如说默认的地图 - asyncore.socket_map 来检查服务器,并使用一个 asyncore.loop(),比如在主线程中,仅用于 server()。 然后您使用客户端处理程序的自定义字典在线程中启动第二个 asyncore.loop() 。 因此,一个循环仅检查接受连接的服务器,当它到达时,它会创建一个处理程序,该处理程序进入单独的处理程序映射,由线程中的另一个 asyncore.loop() 运行ning 检查. 这样,您就不会混淆服务器连接检查和客户端处理。因此,服务器在接受一个连接后立即进行检查。客户端之间的另一个循环平衡。

如果您决心走得更快,您可以通过为处理程序提供更多映射来利用多处理器计算机。 例如,每个 CPU 一个线程和 asyncore.loop() 个线程一样多。 注意,套接字是使用系统调用的 IO 操作,select() 也是一个,因此 GIL 在 asyncore.loop() 等待结果时被释放。这意味着,您将拥有多线程的全部优势,并且每个 CPU 将以字面意义上的并行方式处理其客户端数量。 您需要做的是让服务器分配负载并在连接到达时启动线程循环。 不要忘记 asyncore.loop() 在地图清空时结束。因此,管理客户端的线程中的 loop() 必须在接受新连接时启动,并在某个时间没有更多连接时重新启动。

4。 如果您希望能够 运行 您的服务器在多台计算机上并将它们用作集群,那么您可以在前面安装进程平衡器。 如果你正确地编写了 asyncore 服务器并且只想 运行 它只在一台计算机上,我认为没有必要使用它。