长轮询有效,但不一定是您的最佳选择。在与防火墙和不稳定的互联网连接的集成方面,它开始变得非常讨厌。例如,在工作中,我们的许多客户的防火墙会关闭任何在 10-20 秒内不活动的 HTTP 连接。
通过切换到基于 SSL 的 WebSocket,我们解决了很多问题。WebSocket 为您提供了一个全双工通道,非常适合服务器推送。通过使用 SSL,防火墙在垃圾收集方面通常不那么激进,透明代理经常被 TLS 加密所欺骗。即使您使用 WebSockets 而不是长轮询,您仍然需要在应用程序级别管理偶尔的断开连接,但即使使用合适的恢复协议也可以很好地处理这种情况,无论您使用什么传输协议。
话虽如此,我们决定使用SockJS ,而不是直接使用 WebSockets 。这种选择的主要原因是 SockJS 可以在可用时使用 WebSockets(rfc6455、hixie-76、hybi-10),但如果客户端的浏览器不支持它,也可以回退到 xhr-streaming、xdr-streaming等(或者如果连接失败)。当我说它可以“回退”时,我的意思是您在客户端使用的代码保持完全相同,SockJS 负责处理这些脏活。
在服务器端,同样如此。我们目前为 Twisted 使用Cyclone的SockJS 实现(在生产中),但我们也知道DesertBus 的实现,我们仍然需要检查它。我们还希望查看其他一些东西,例如WAMP和随附的Autobahn|Python。
在性能方面,我们使用HAProxy进行 SSL 终止和负载平衡。HAProxy 的性能在多个层面上都非常惊人。