我运行一个网站,用户可以通过浏览器互相聊天(想想Facebook聊天) . 处理实时交互的最佳方式是什么? (现在我每隔30秒进行一次民意调查,以更新在线用户和新收到的消息,以及每秒在聊天页面上进行的另一次民意调查以获取新消息 . )
我考虑过的事情:
-
HTML5 Web套接字:didn 't use this because it doesn'适用于所有浏览器(仅限chrome) .
-
Flash套接字:没有使用它,因为我想最终支持移动网络 .
现在,我正在使用短轮询,因为我不知道AJAX长度轮询的可扩展性如何 . 我正在从servint运行VPS服务器(运行apache) . 我应该使用长轮询还是短轮询?我不需要绝对的立即响应时间(对于聊天应用来说只是“足够好”) . 是否有几十万用户要杀死我的服务器?我该如何扩展,请帮忙!
3 回答
几点说明:
每秒轮询都是矫枉过正 . 通过检查之间的几秒延迟,应用程序仍然会感觉非常敏感 .
要保存数据库的流量和速度响应,请考虑使用内存缓存来存储未传递的消息 . 您仍然可以将消息持久保存到数据库,内存缓存将仅用于查询新消息,以避免每个用户每隔x秒对数据库进行一次查询 .
超时用户's chat after x seconds of inactivity to stop polling to your server. This assures someone leaving a window open won' t继续生成流量 . 为超时之前提供一个简单的"Still there? Continue chatting."链接,并在超时之前警告用户,以便延长超时时间 .
I 'd suggest starting out with polling rather than comet/long polling/sockets. Polling is simple to build and support and will likely scale just fine in the short-term. If you get a lot of traffic you can throw hardware and a load balancer at the problem to scale. The entire web is based on polling - polling most certainly scales. There'这一点,像彗星/长轮询/等替代方案的复杂性是有意义的,但在额外的开发时间/复杂性合理之前,您需要大量的流量 .
这是每个人在引入cometd和nodejs之前做过的事情 .
我认为问题是Apache上的PHP请求非常昂贵 . 如果您的聊天应用程序每秒检查一次消息,您将发现自己处于Apache没有足够资源来响应请求的情况 . 我认为需要改进的另一个领域是改善聊天应用程序的上下文 .
如果不检索新消息,为什么每秒都会更新?如果没有消息怎么办?
你可以使用一些技巧;
为您的客户提供轻量级 endpoints ,其中包含聊天会话的上下文,待处理的新消息,消息的数量等 . 如果没有新消息,客户端可以通过立即更新来响应 . 此 endpoints 可以通过http请求提供简单的json对象 . 您可以保证此状态消息的大小固定,如果状态响应没有改变,您可以将其拒绝 . 见下一条消息 .
javascript轮询中的简单衰减,如果客户端连续几次从服务器收到相同的响应,您可以按设定的时间递增轮询,目前您说它是每秒 . 如果你这样做,你将增加到每2,4,6,8,10秒 . 一旦服务器的响应发生变化,您就会重置衰减 .
要考虑的一些优化;
使用像APC这样的PHP操作码缓存 .
在所有请求上设置低超时,您不希望任何请求挂起您的服务器 .
优化您的PHP代码,使其精益和快速 .
运行一些负载测试以查看您的限制 .
基准性能通常是为了确保您的应用程序变得更快 .
检查apache日志,了解应用程序整体运行状况和响应时间的故事迹象 .
当需要进行扩展时,添加新服务器并使用负载 balancer 器来分发请求 . 我已经使用Varnish和HAProxy取得了巨大的成功,设置它们并不复杂 .
如果我是你,我会选择一个使用html5网络套接字的库,但如果html5不可用则会重新使用闪存套接字,那么通过破解的浏览器应该是分钟 .
你也应该放弃php或者使用带有em-websocket的python或ruby编写的线程套接字服务器来补充它 .