由于你使用的是事件循环而不是线程,实际的服务器看起来如何?
我知道它使用事件循环,但是你如何分离请求?你如何防止你的服务器运行速度非常慢(因为我认为,因为它是无螺纹的,所以一次只能推送一件东西?)
某种伪代码会很棒。
原谅我的无知;当然,如果某个地方用非基本的方式解释它“这样就足够了,直到你有1000名游客的方式”,我很高兴知道它。
答案 0 :(得分:5)
长轮询服务器的实现细节会因平台而异,因此您的假设可能不正确。
我使用.NET为our website实现了COMET服务器。我利用HttpListener来做所有无聊的http内容和Microsoft CCR来处理所有异步IO。它使用一个线程池来处理请求,当它们进入时。它不是每个客户端的一个线程,但它不是单线程,通常需要几十个线程来保持流畅,因为用户数量增加。这种方法意味着我们可以轻松扩展到多个CPU内核。 CCR异步枚举器模式确实有助于保持异步逻辑的整洁,一年后我可以很容易地读取代码。
这种方法已证明具有极高的可扩展性。我已经测试了多达20000个客户端,于是我们受到网络IO的约束。它处理所有客户端(“永久”连接,每30秒重新连接一次),服务器负载为1-2%。绝对值得重新考虑您的假设,即您必须选择事件循环架构而不是多线程。中间层对我来说非常好用,处理IO绑定任务的.NET asynchronous programming model真的让你不再需要微管理线程。实际上,当要处理的IO数据时,从池中借用一个线程来执行该处理,然后返回到池中,准备为另一个请求提供服务。 All the complicated IOCP stuff被摘除了。