我正在使用python Twisted框架开发群聊。我使用的技术是使用Ajax进行长轮询。我正在返回SERVER_NOT_DONE_YET以保持连接打开。代码是非阻塞的,允许其他请求。它有多大的可扩展性?
但是,我希望通过开放连接超越此流式传输。我想实现纯服务器推送。怎么做 ?我是否需要朝着XMPP的方向前进?如果我在服务器上为每个唯一客户端打开一个套接字,哪个Web服务器最适合桥接?它会有多大的可扩展性?
我希望它具有与C10K问题一样多的可扩展性。我想坚持使用Twisted,因为它有很多协议实现的简单步骤。请指出我正确的方向。 Thanx
答案 0 :(得分:1)
长轮询有效,但不一定是您的最佳选择。在与防火墙和片状互联网连接的集成方面,它开始变得非常讨厌。例如,在工作中,我们的许多客户的防火墙会终止任何非活动状态10到20秒的HTTP连接。
我们通过SSL切换到WebSocket解决了很多问题。 WebSocket为您提供全双工通道,非常适合服务器推送。通过使用SSL,防火墙在垃圾收集方面往往不那么积极,transparent proxies are often fooled by the TLS encryption。您仍然需要管理应用程序级别的偶然断开连接,即使您使用的是WebSockets而不是长轮询,但即使可以通过使用适当的恢复协议来优雅地处理,无论您使用何种传输协议。
这就是说,我们决定使用SockJS而不是直接使用WebSockets。这个选择的主要原因是SockJS可以在可用时使用WebSockets(rfc6455,hixie-76,hybi-10),但如果客户端的浏览器确实如此,也可以回到xhr-streaming,xdr-streaming,etc。不支持它(或者如果连接失败)。当我说它可以“退回”时,我的意思是你在客户端使用的代码仍然完全相同,SockJS会处理肮脏的工作。
在服务器端,情况也是如此。我们目前使用Cyclone的SockJS implementation作为Twisted(正在制作中),但我们也知道DesertBus'实现,我们仍需要查看。我们还希望查看其他一些内容,例如WAMP和附带的Autobahn|Python。
关于性能,我们使用HAProxy进行SSL终止和负载平衡。 HAProxy的performance is pretty amazing,在很多层面上。
答案 1 :(得分:0)
我们现在已迁移到WebSockets。它工作得很好!!