由于您使用的是事件循环而不是线程,实际服务器的外观如何?
我知道它使用事件循环,但你如何分离请求?以及如何防止服务器运行速度极慢(因为它是无线程的,我认为一次只能推送一件事?)
某种伪代码会很棒。
原谅我的无知;当然,如果有什么地方可以用非基本的“这已经足够好,直到你获得 1000 名访客”来解释它,我会很高兴知道这一点。
由于您使用的是事件循环而不是线程,实际服务器的外观如何?
我知道它使用事件循环,但你如何分离请求?以及如何防止服务器运行速度极慢(因为它是无线程的,我认为一次只能推送一件事?)
某种伪代码会很棒。
原谅我的无知;当然,如果有什么地方可以用非基本的“这已经足够好,直到你获得 1000 名访客”来解释它,我会很高兴知道这一点。
长轮询服务器的实现细节会因平台而异,以至于您的假设可能不正确。
我使用 .NET为我们的网站实现了 COMET 服务器。我利用HttpListener来完成所有无聊的 http 工作,并利用Microsoft CCR来处理所有异步 IO。它使用线程池在请求进入时为请求提供服务。它不是每个客户端一个线程,但它也不是单线程的,通常需要几十个线程才能随着用户数量的增加而保持流畅。这种方法意味着我们可以轻松地跨多个 CPU 内核进行扩展。CCR 异步枚举器模式确实有助于保持异步逻辑的整洁,一年后我可以相当轻松地阅读代码。
事实证明,这种方法具有极强的可扩展性。我已经测试了多达 20000 个客户端,因此我们受到网络 IO 的约束。它处理我们所有的客户端(“永久”连接,每 30 秒重新连接一次)以 1-2% 的服务器负载运行。绝对值得重新考虑您的假设,即您必须选择事件循环架构而不是多线程。中间立场对我来说非常有效,用于处理 IO 绑定任务的.NET 异步编程模型确实使您无需对线程进行微观管理。实际上,当有 IO 数据要处理时,会从池中借用一个线程来执行该处理,然后返回池准备服务另一个请求。所有复杂的 IOCP 东西都被抽象掉了。