使用Twisted框架实现服务器推送

时间:2013-06-24 04:52:39

标签: push-notification chat push twisted twisted.web

我正在使用python Twisted框架开发群聊。我使用的技术是使用Ajax进行长轮询。我正在返回SERVER_NOT_DONE_YET以保持连接打开。代码是非阻塞的,允许其他请求。它有多大的可扩展性?

但是,我希望通过开放连接超越此流式传输。我想实现纯服务器推送。怎么做 ?我是否需要朝着XMPP的方向前进?如果我在服务器上为每个唯一客户端打开一个套接字,哪个Web服务器最适合桥接?它会有多大的可扩展性?

我希望它具有与C10K问题一样多的可扩展性。我想坚持使用Twisted,因为它有很多协议实现的简单步骤。请指出我正确的方向。 Thanx

2 个答案:

答案 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会处理肮脏的工作。

在服务器端,情况也是如此。我们目前使用CycloneSockJS implementation作为Twisted(正在制作中),但我们也知道DesertBus'实现,我们仍需要查看。我们还希望查看其他一些内容,例如WAMP和附带的Autobahn|Python

关于性能,我们使用HAProxy进行SSL终止和负载平衡。 HAProxy的performance is pretty amazing,在很多层面上。

答案 1 :(得分:0)

我们现在已迁移到WebSockets。它工作得很好!!