想做一个类似QQ群的聊天群,基于WEB的。感觉上又有点像聊天室的味道。
请问一下各位高人,关于同时在线人数有上千人的聊天室,是怎么样架构的呢,采用的技术又是什么呢?
以前我做过的在线客服是通过存在application对象中然后通过Ajax来定时读取。但是感觉这套用在聊天室里就有点不不合适,特别是人数过多的情况下。故,求高人解答下类似问题的架构情况。
请问一下各位高人,关于同时在线人数有上千人的聊天室,是怎么样架构的呢,采用的技术又是什么呢?
以前我做过的在线客服是通过存在application对象中然后通过Ajax来定时读取。但是感觉这套用在聊天室里就有点不不合适,特别是人数过多的情况下。故,求高人解答下类似问题的架构情况。
1、基于拉的模型:没有流行Ajax以前用一个隐藏iframe刷数据,后来有了Ajax方便许多;
——但问题都是类似的,增加服务器的请求负担,所以控制访问频度和缓存模型成为了关键。比较流行的做法是应用服务器接收到大家的发言后,周期性将数据发布到Apache或Nignx上,每个聊天室用一组不同的数据文件,这样应用服务器压力大大降低;但这种模型存在安全问题。
2、基于推的模型:服务器端持续不关闭response流,然后可以持续发送数据;HTML5中也支持了这种;
——问题同样是类似的,因为不能关闭response流,所以将持续占用服务器端口。权衡与选择。
Google下,有很多例子的,说白了就是Servlet函数一直不结束,类似于:
while(true) {
取聊天室的公共消息区最新消息;
write给浏览器;
sleep();
}
当浏览器关闭,服务端这边就会抛出IOException,然后就结束了。
当然用于处理浏览器发送过来的 发言,用另一个Servlet处理,那个专门负责把发言写入“聊天室公共消息区”,然后就结束返回。
谢谢啦,跟我想的差不多,我想的也是用一个while循环,来控制的~Thanks
1、聊友发言(网友发表回复):用Ajax或FormPOST方式将数据push给服务器,服务器将数据进行记录;
2、服务器发布发言:服务器将数据整理为HTML或JS文件,发布到Apache之类的高性能服务器上,根据聊天室编码来进行目录切分;
2、聊友持续查看聊天室发言记录:浏览器借助Ajax定期访问Apache上对应的HTML或JS文件,合并到聊天室所显示的内容列表中。
请问如何实现清屏操作,和图片的发送。
最开始我的设想是在application里只保存最新的300条信息简称“信息池”,所有聊天信息存进TXT文件,可用作聊天记录下载什么的,所有登录进聊天室的人都来操作这个 “信息池”,都可以向里面发送信息,然后通过ajax从“信息池”来拉取信息。
但是唯一的疑问就是在,当房间过多的时候那么虽然每个房间在application里保存300条信息,但是房间多了基数也就大了!