2011-03-15 137 views
31

我运行一个网站,用户可以通过浏览器相互聊天(想想Facebook聊天)。处理现场互动的最佳方式是什么? (现在我有一个民意调查会每隔30秒更新在线用户和新传入的消息,而另一个民调回事聊天页每秒,以获得新的消息。)扩展聊天应用 - 短轮询与长轮询(AJAX,PHP)

事情我已经考虑:

  • HTML5 Web套接字:没有使用它,因为它不适用于所有浏览器(仅限Chrome)。
  • Flash套接字:没有使用这个,因为我想最终支持移动网络。

现在,我使用短轮询,因为我不知道如何可伸缩AJAX长轮询会是。我现在从servint运行VPS服务器(运行apache)。我应该使用长轮询还是短轮询?我不需要绝对即时的响应时间(对于聊天应用程序“足够好”)。是否经常用几十万个用户来杀死我的服务器?我如何扩展这个,请帮助!

+1

我知道的Apache通常不能与许多并发连接处理好。同时也意识到可能会为此scenerio(nodejs等)构建其他解决方案。但现在,我想避免重写整个应用程序。 – 2011-03-15 15:04:38

+0

如何为不同的平台实施多种解决方案?即,如果支持HTML5,则浏览器使用HTML5,如果支持flash,则浏览器使用flash,如果以上都不支持,则浏览器使用ajax。 – binaryLV 2011-03-15 15:16:36

+0

你可能有兴趣在这个岗位http://urbanairship.com/blog/2010/09/29/linux-kernel-tuning-for-c500k/ – 2011-03-16 13:33:18

回答

41

的几个注意事项:

  • 轮询每一秒都是矫枉过正。这些应用程序在检查之间延迟几秒钟后仍会感觉非常敏感。
  • 要保存数据库的流量和速度响应,请考虑使用内存缓存来存储未传送的消息。您仍然可以将消息保存到数据库,内存缓存将仅用于查询新消息,以避免每个用户每隔x秒查询一次数据库。
  • 超时闲置x秒后用户的聊天停止轮询到您的服务器。这确保有人离开窗户不会继续产生流量。提供简单的“仍然存在?继续聊天”。链接会话超时并在超时前警告用户,以便延长超时时间。
  • 我建议从轮询开始而不是彗星/长轮询/插座。轮询很容易建立和支持,并可能在短期内很好地扩展。如果你得到很多流量,你可以在硬件和负载平衡器上解决问题。整个网络基于投票 - 投票最肯定的比例。有一点像慧星/长轮询等替代品的复杂性是有道理的,但在额外的开发时间/复杂度是合理的之前,您需要大量的流量。
+0

你最后一点是非常有帮助的 - 我一直在试图决定我的应用程序中第一个轮询实现需要如何面向未来,并且我认为我会采纳您的建议并快速开展简单的轮询工作,然后计划一个智能的,长期解决方案 – simmer 2015-02-08 00:11:54

22

这是大家在介绍cometd和nodejs之前曾经做过的事情。

我发现这个问题是Apache上的PHP请求非常昂贵。如果您的聊天应用程序每秒都会检查消息,则会发现自己处于Apache没有足够资源来响应请求的情况。我认为需要改进的其他领域是改进聊天应用程序的上下文。

为什么每秒更新一次,如果不是检索新消息? 如果没有消息会怎么样?

你可以使用一些技巧;

  • 提供一个轻量级的端点客户有关于聊天会话一些背景,是一个新的消息之前,多少邮件等客户端可以立即或没有,如果有更新对此作出回应没有新消息。这个端点可以通过http请求提供一个简单的json对象。你保证这个状态信息将是一个固定的大小,如果状态的响应没有改变,你可以衰减它。看下一条消息。

  • 如果客户端连续几次从服务器接收到相同的响应,您可以在设定的时间内增加轮询,目前您说这是每秒一次,那么在您的javascript轮询中会出现一个简单的衰减。如果你这样做,你会增加到每2,4,6,8,10秒。只要服务器的响应发生变化,您就会重置衰减。

要考虑的一些优化;

  • 使用类似APC的PHP操作码缓存。

  • 在所有请求中设置低超时,您不希望任何请求挂起您的服务器。

  • 优化您的PHP代码,使其精益和快速。

  • 运行一些负载测试,看看你的限制是什么。

  • 基准性能往往以确保您的应用程序也越来越快。

  • 检查Apache日志的应用和响应时间的整体健康的告诉故事的迹象。

当需要扩展时,添加一个新服务器并使用负载平衡器分配请求。我用Varnish和HAProxy取得了巨大的成功,设置它们也不复杂。

+0

动态增量是我从来没有想过,真的好点 – JayIsTooCommon 2016-04-05 09:35:17

1

如果我是你,我会选择使用HTML5网页插座又倒在闪光灯插座,如果HTML5是不可用的库,通过裂缝下跌应该是微小的浏览器。

你也应该要么放弃PHP或无论是在Python或Ruby与EM-WebSocket的书面螺纹插槽服务器补充。