首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >缩放聊天应用程序-短轮询与长轮询(AJAX,PHP)

缩放聊天应用程序-短轮询与长轮询(AJAX,PHP)
EN

Stack Overflow用户
提问于 2011-03-15 15:02:02
回答 3查看 19K关注 0票数 34

我经营一个网站,用户可以通过浏览器互相聊天(想想Facebook聊天)。处理现场互动的最佳方法是什么?(现在,我每30秒进行一次投票,更新在线用户和新传入的消息,每秒钟在聊天页面上进行另一次投票,以获取新消息。)

我考虑过的事情:

  • HTML5网络套接字:没有使用它是因为它不能在所有浏览器(只有铬)中工作。
  • Flash:没有使用它是因为我想最终支持移动Web。

现在,我使用的是短轮询,因为我不知道AJAX长轮询的可伸缩性有多大。我现在正在从servint运行一个VPS服务器(运行apache)。我应该使用长轮询还是短轮询?我不需要绝对的即时响应时间(对聊天应用来说“足够好”)。短时间轮询经常会有几十万用户要杀死我的服务器吗?我该怎么做,请帮忙!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-16 15:56:47

几个注意事项:

  • 每秒钟轮询一次就太过分了。该应用程序仍将感到非常响应与几秒钟之间的检查延迟。为了保存db的流量和速度响应,请考虑使用内存中的缓存来存储未传递的消息。您仍然可以将消息持久化到db,内存中的缓存只用于查询新消息,以避免每个用户每隔x秒对数据库进行查询。
  • 暂停用户在不活动x秒钟后的聊天,以停止对服务器的轮询。这可以确保打开窗口的人不会继续产生流量。提供一个简单的“还在吗?继续聊天”。链接到超时会话,并在超时之前警告用户,以便他们可以延长超时。

  • ,我建议从轮询开始,而不是从comet/long轮询/套接字开始。民意调查很容易建立和支持,而且在短期内可能会很好地扩展。如果您获得了大量的流量,您可以抛出硬件和负载均衡器在问题的规模。整个网络都是基于轮询的--当然是规模更大的投票。在某种程度上,彗星/长轮询/等替代方案的复杂性是有意义的,但在证明额外的开发时间/复杂性合理之前,您需要大量的通信量。
票数 45
EN

Stack Overflow用户

发布于 2011-03-16 11:39:25

这是每个人在推出cometd和nodejs之前都做过的事情。

在我看来,Apache上的PHP请求是非常昂贵的。如果您的聊天应用程序每秒钟检查一次消息,您就会发现Apache没有足够的资源来响应请求。我认为需要改进的另一个方面是改善聊天应用程序的上下文。

如果不检索新消息,为什么它每秒钟更新一次?如果没有留言怎么办?

一些你可以使用的技巧;

  • 为您的客户端提供了一个轻量级的端点,该端点具有聊天会话的一些上下文,是一条新消息挂起,有多少条消息等等。如果没有新消息,客户端可以立即更新或不更新。这个端点可以通过http请求提供一个简单的json对象。您可以保证此状态消息的大小是固定的,如果状态的响应没有改变,则可以对其进行衰减。请看下一条留言。
  • -- javascript轮询中的简单衰变,如果客户机连续几次从服务器接收到相同的响应,则可以将轮询增加一个固定时间,目前您说它是每秒钟一次。如果你这样做,你会增加到每2,4,6,8,10秒。一旦服务器的响应发生变化,您就会重置衰变。

需要考虑的一些优化;

server.

  • Optimize

  • 使用PHP缓存,类似于APC。

  • 对所有请求设置了一个低超时,您不希望任何请求挂起您的PHP代码,使其变得简洁和快速。

  • 运行一些负载测试来查看您的限制。faster.

  • Check

  • 通常会对应用程序的性能进行基准测试,以确保应用程序获得

apache日志,从而判断应用程序的总体健康状况和响应时间。

当需要缩放时,添加一个新服务器并使用负载均衡器来分发请求。我使用过清漆和HAProxy,并取得了很大的成功,建立起来也不复杂。

票数 23
EN

Stack Overflow用户

发布于 2011-03-16 14:11:43

如果我是你,我会选择一个使用html5网络套接字的库,如果html5不可用的话,它就会回到闪存套接字上,通过漏洞的浏览器应该是一分钟。

另外,您应该放弃php,或者用用python编写的线程套接字服务器来补充它,或者用em-websocket来补充ruby。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5313641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档