2010-06-30 26 views
2

由于您使用的是事件循环而不是线程,因此实际服务器的外观如何?(全功能)长轮询服务器如何抽象地工作

我知道它使用事件循环,但是如何分离请求?并且,如何防止服务器运行速度非常缓慢(因为我认为它一次只能推一件东西,因为它是无螺纹的)?

某种伪代码会很好。

原谅我的无知;当然,如果有某个地方可以用非基本的方式解释它“这足够好,直到你有1000名游客的方式”,我很高兴知道这一点。

+1

你能澄清你的问题吗?你在问长轮询或事件驱动架构吗?你问关于网络服务器还是网络应用程序?无论如何,也许这个:http://www.kegel.com/c10k.html可能会派上用场。 – ninjalj 2010-06-30 23:07:49

回答

5

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

我使用.NET为our website实现了一个COMET服务器。我利用HttpListener做所有的无聊http的东西和Microsoft CCR来处理所有的异步IO。它使用线程池来为请求提供服务,当它们进来时,它不是每个客户端的线程,但它不是单线程的,通常需要几十个线程随着用户数量的增加而保持流畅。这种方法意味着我们可以轻松扩展到多个CPU内核。 CCR的异步枚举模式确实有助于保持异步逻辑的美观和整洁,并且一年后我可以很容易地读取代码。

此方法已被证明具有极高的可扩展性。我测试了多达20000个客户端,于是我们受到网络IO的约束。它处理所有我们的客户(他们“永久”连接,每30秒重新连接一次),服务器负载为1-2%。绝对值得重新考虑你的假设,即你必须选择一个事件循环体系结构而不是多个线程。中间地带对我来说工作得非常好,而且处理IO边界任务的.NET asynchronous programming model确实使您远离需要的微管理线程。实际上,当要处理I​​O数据时,会从池中借用一个线程来执行该处理,然后返回到池以准备处理其他请求。 All the complicated IOCP stuff被抽象出来。