想做一个类似QQ群的聊天群,基于WEB的。感觉上又有点像聊天室的味道。
请问一下各位高人,关于同时在线人数有上千人的聊天室,是怎么样架构的呢,采用的技术又是什么呢?
以前我做过的在线客服是通过存在application对象中然后通过Ajax来定时读取。但是感觉这套用在聊天室里就有点不不合适,特别是人数过多的情况下。故,求高人解答下类似问题的架构情况。

解决方案 »

  1.   

    基于J2EE的话,没啥更合适的套路。因为Web应用一直以来就没有什么优美的消息推送框架,所以一直以来基本上只有两种套路:
    1、基于拉的模型:没有流行Ajax以前用一个隐藏iframe刷数据,后来有了Ajax方便许多;
    ——但问题都是类似的,增加服务器的请求负担,所以控制访问频度和缓存模型成为了关键。比较流行的做法是应用服务器接收到大家的发言后,周期性将数据发布到Apache或Nignx上,每个聊天室用一组不同的数据文件,这样应用服务器压力大大降低;但这种模型存在安全问题。
    2、基于推的模型:服务器端持续不关闭response流,然后可以持续发送数据;HTML5中也支持了这种;
    ——问题同样是类似的,因为不能关闭response流,所以将持续占用服务器端口。权衡与选择。
      

  2.   


    Google下,有很多例子的,说白了就是Servlet函数一直不结束,类似于:
    while(true) {
      取聊天室的公共消息区最新消息;
      write给浏览器;
      sleep();
    }
    当浏览器关闭,服务端这边就会抛出IOException,然后就结束了。
    当然用于处理浏览器发送过来的 发言,用另一个Servlet处理,那个专门负责把发言写入“聊天室公共消息区”,然后就结束返回。
      

  3.   


    谢谢啦,跟我想的差不多,我想的也是用一个while循环,来控制的~Thanks
      

  4.   

    楼主哪天有了例子上面的实现了,还请发送个例子,关注这种问题多时了。[email protected]
      

  5.   

    认真分析下聊天室基于拉的模型(Ajax),会发现其有两个特点跟CSDN论坛很相似:1、查询量非常高;2、信息发布量相比查询量而言要低很多。因此网站的架构是可以借鉴到聊天室中的,按照业务流程来看这个事情:
    1、聊友发言(网友发表回复):用Ajax或FormPOST方式将数据push给服务器,服务器将数据进行记录;
    2、服务器发布发言:服务器将数据整理为HTML或JS文件,发布到Apache之类的高性能服务器上,根据聊天室编码来进行目录切分;
    2、聊友持续查看聊天室发言记录:浏览器借助Ajax定期访问Apache上对应的HTML或JS文件,合并到聊天室所显示的内容列表中。
      

  6.   


    请问如何实现清屏操作,和图片的发送。
    最开始我的设想是在application里只保存最新的300条信息简称“信息池”,所有聊天信息存进TXT文件,可用作聊天记录下载什么的,所有登录进聊天室的人都来操作这个 “信息池”,都可以向里面发送信息,然后通过ajax从“信息池”来拉取信息。
    但是唯一的疑问就是在,当房间过多的时候那么虽然每个房间在application里保存300条信息,但是房间多了基数也就大了!