代码之家  ›  专栏  ›  技术社区  ›  Aaron Yodaiken

(全功能)长轮询服务器如何抽象地工作

  •  2
  • Aaron Yodaiken  · 技术社区  · 14 年前

    因为您使用的是事件循环,而不是线程,所以实际的服务器看起来如何?

    我知道它使用了一个事件循环,但是如何将请求分离出来呢?你如何防止你的服务器运行得非常慢(我想,因为它一次只能推一个东西,因为它是无线程的?)

    某种伪代码会很好。

    请原谅我的无知;当然,如果有什么地方能用一种非基本的方式来解释这一点,“这就足够好了,直到你有1000个访客,我会很高兴知道的。

    1 回复  |  直到 14 年前
        1
  •  5
  •   Community basarat    7 年前

    长轮询服务器的实现细节因平台而异,因此您的假设可能不正确。

    我为实现了一个Comet服务器 our website 使用.NET。我杠杆 HttpListener 做所有无聊的HTTP工作 Microsoft CCR 处理所有的异步IO。它使用一个线程池在请求进入时为请求提供服务。它不是每个客户机的线程,但它不是单线程的,或者通常需要几十个线程来保持流体,因为用户数量增加。这种方法意味着我们可以轻松地跨多个CPU核心进行扩展。CCRS异步枚举器模式确实帮助保持了异步逻辑的整洁,一年后我可以很容易地读取代码。

    事实证明,这种方法具有极强的可扩展性。我已经测试了20000个客户机,因此我们被网络IO绑定。它处理我们所有的客户机(它们“永久”连接,每30秒重新连接一次),以1-2%的服务器负载运行。绝对值得重新考虑您的假设,即必须选择事件循环体系结构而不是多线程。中间地带对我来说很好,而且 .NET asynchronous programming model 对于处理IO绑定的任务,您实际上不需要对线程进行微管理。实际上,当存在要处理的IO数据时,会从池中借用一个线程来进行该处理,然后返回到池中,准备为另一个请求提供服务。 All the complicated IOCP stuff 是抽象的。