1

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

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

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

4

2 回答 2

1

长轮询有效,但不一定是您的最佳选择。在与防火墙和不稳定的互联网连接的集成方面,它开始变得非常讨厌。例如,在工作中,我们的许多客户的防火墙会关闭任何在 10-20 秒内不活动的 HTTP 连接。

通过切换到基于 SSL 的 WebSocket,我们解决了很多问题。WebSocket 为您提供了一个全双工通道,非常适合服务器推送。通过使用 SSL,防火墙在垃圾收集方面通常不那么激进,透明代理经常被 TLS 加密所欺骗。即使您使用 WebSockets 而不是长轮询,您仍然需要在应用程序级别管理偶尔的断开连接,但即使使用合适的恢复协议也可以很好地处理这种情况,无论您使用什么传输协议。

话虽如此,我们决定使用SockJS ,而不是直接使用 WebSockets 。这种选择的主要原因是 SockJS 可以在可用时使用 WebSockets(rfc6455、hixie-76、hybi-10),但如果客户端的浏览器不支持它,也可以回退到 xhr-streaming、xdr-streaming(或者如果连接失败)。当我说它可以“回退”时,我的意思是您在客户端使用的代码保持完全相同,SockJS 负责处理这些脏活。

在服务器端,同样如此。我们目前为 Twisted 使用CycloneSockJS 实现(在生产中),但我们也知道DesertBus 的实现,我们仍然需要检查它。我们还希望查看其他一些东西,例如WAMP和随附的Autobahn|Python

在性能方面,我们使用HAProxy进行 SSL 终止和负载平衡。HAProxy 的性能在多个层面上都非常惊人。

于 2014-02-08T18:58:27.690 回答
0

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

于 2015-08-20T11:08:38.087 回答