哪个更好?长 TCP 连接还是长轮询?
Posted
技术标签:
【中文标题】哪个更好?长 TCP 连接还是长轮询?【英文标题】:Which is better? Long TCP connection or long-polling? 【发布时间】:2009-06-20 05:04:40 【问题描述】:我打算在我的网站上建立一个网络聊天。我知道有两种方法:一种是使用XMPP web客户端(通过flash,长TCP连接),另一种是facebook方式,长轮询。
但是 facebook 将更新他们的聊天以支持 Jabber (XMPP),那么有人能告诉我们哪种方式更好吗? (包括升级到 XMPP)
【问题讨论】:
Facebook 聊天使用 Erlang,因此拥有 100 000 个连接的权衡并不像使用其他语言那样困难 如果像聊天一样从 Facebook 升级到 XMPP 会做多少工作?如果从一开始就采用 XMPP 方式会更好? 【参考方案1】:在我的应用程序中使用长轮询获得了相当不错的结果,但更大的问题是您是否要面对C10K problem。如果是这样,至少在短期内,构建代码以处理这种繁重的工作负载可能会主导所有其他设计考虑因素。 :-)
除了服务器负载之外,使用哪种策略的主要考虑因素是客户端环境兼容性——为了能够在只允许 HTTP 的严苛防火墙或禁止任何插件的浏览器环境中工作,长轮询是唯一的生存方式,但它比简单的 TCP 连接方式开销更大。
【讨论】:
工作负载在某种程度上是架构的可伸缩性问题。但是如果我选择长轮询,那么升级到 XMPP 容易吗?有哪些资源可用于构建这样的网络聊天系统?有人可以比较一下吗? 幸运的是,该问题很容易分解为可与聊天应用程序本身分离的可插入传输组件,因此如果编写良好,应该可以直接支持两者。【参考方案2】:它们有不同的优点和缺点,例如:TCP 需要一个插件(至少在 html5 网络套接字得到广泛支持之前),长轮询性能较差等。我不是这种差异的专家,这就是为什么我'会建议您避免做出这种选择,避免开发和调整每种方法所涉及的,避免未来可用技术的变化(即随着 HTML5 的到来),使用 抽象的库使用的传输方法,并根据客户端能力选择最佳方法:
http://socket.io/
这个奇妙的库让创建实时应用程序变得异常简单!并且有各种服务器端实现:Python (Tornado)、Java、Google GO、Rack (Ruby),除了 Node.js 中的主流实现(服务器端 javascript)
【讨论】:
以上是关于哪个更好?长 TCP 连接还是长轮询?的主要内容,如果未能解决你的问题,请参考以下文章