当前位置: 技术问答>java相关
###用JAVA做聊天室的一个效率问题,请帮忙!###
来源: 互联网 发布时间:2015-09-24
本文导语: 我们正在用做JAVA一个聊天室,有如下一个效率问题,还请指教: 我们现在服务器端的机制是每接到某个客户端发过来的一句话就将这句话发送给其余所有在聊天室内的用户。 但是这样的话服务器端就会发送非常多的...
我们正在用做JAVA一个聊天室,有如下一个效率问题,还请指教:
我们现在服务器端的机制是每接到某个客户端发过来的一句话就将这句话发送给其余所有在聊天室内的用户。
但是这样的话服务器端就会发送非常多的消息,导致效率下降。
例如聊天室内有100个人,这100个人每人每秒发一条消息的话,那么服务器端每秒钟要发送接近10000条消息。n平方级的增长将导致人多时服务器负担过重。
考虑过采用组播,但是广域网上不能使用组播(因为有些路由器不支持)
这样的话应该怎样才能提高效率呢?
现有的那些高效率的聊天室是怎样解决这个问题的呢?
我们现在服务器端的机制是每接到某个客户端发过来的一句话就将这句话发送给其余所有在聊天室内的用户。
但是这样的话服务器端就会发送非常多的消息,导致效率下降。
例如聊天室内有100个人,这100个人每人每秒发一条消息的话,那么服务器端每秒钟要发送接近10000条消息。n平方级的增长将导致人多时服务器负担过重。
考虑过采用组播,但是广域网上不能使用组播(因为有些路由器不支持)
这样的话应该怎样才能提高效率呢?
现有的那些高效率的聊天室是怎样解决这个问题的呢?
|
163用irc改的
大家都说让客户端自己去取,我觉得未必。
这种思路主要是沿袭了以往做web chat的经验,毕竟http协议是无状态协议,服务器无法主动“推”送数据给客户端,所以造成只能让客户端采用种种方式比如定时刷新或者xmlhttpget和remotescript等方式来“刷新”数据。
这样难道服务器负载就小么?
比如说1000个人同时在线,一秒钟刷新一次:如果一秒钟之内没有人发言呢?WebServer要接受1000个request...如果没有采用http 1.1的keep alive,那样对WebServer来说就是1000个Socket请求...
网易早先用IRC来做聊天室,后来据说使用java改了服务器端。想必是用hashset一类的collection来保存数据的。不过你可以采用一些cache机制,例如把半秒钟内更新的数据放在buffer中,定时向collection中的人发一次数据,而不是每次有更新都发。
我所知道的和推荐的,做这样的应用还用c比较好--如果你的需求中对效率问题比较敏感 x]
btw, 所谓的“推”技术,早先是一班不懂socket编程,从web开始进入编程领域的“程序员”提出的概念,所以造成后来的很多误解。
大家都说让客户端自己去取,我觉得未必。
这种思路主要是沿袭了以往做web chat的经验,毕竟http协议是无状态协议,服务器无法主动“推”送数据给客户端,所以造成只能让客户端采用种种方式比如定时刷新或者xmlhttpget和remotescript等方式来“刷新”数据。
这样难道服务器负载就小么?
比如说1000个人同时在线,一秒钟刷新一次:如果一秒钟之内没有人发言呢?WebServer要接受1000个request...如果没有采用http 1.1的keep alive,那样对WebServer来说就是1000个Socket请求...
网易早先用IRC来做聊天室,后来据说使用java改了服务器端。想必是用hashset一类的collection来保存数据的。不过你可以采用一些cache机制,例如把半秒钟内更新的数据放在buffer中,定时向collection中的人发一次数据,而不是每次有更新都发。
我所知道的和推荐的,做这样的应用还用c比较好--如果你的需求中对效率问题比较敏感 x]
btw, 所谓的“推”技术,早先是一班不懂socket编程,从web开始进入编程领域的“程序员”提出的概念,所以造成后来的很多误解。
|
好象一般都不是服务器主动发送消息,而是客户端美隔一段时间去服务器上读取
每个客户端的消息都是些在服务器上统一的地方。其实也不是什么好办法。
每个客户端的消息都是些在服务器上统一的地方。其实也不是什么好办法。
|
我觉得服务端向客户端推信息是没法提高速度地
可以在数据库上建一个表,存放最近n条消息,客户端每隔一定时间自动刷新
也可不用数据库,应文件存放消息,但可能会比数据库慢
|
由每个客户间隔一定时间去刷新数据可以吗?
|
由客户端自己去向数据库刷新数据
|
由每个客户间隔一定时间去取服務器的数据
|
用过RaceChat吗?
华军软件园有,可以反编译来瞧瞧。
华军软件园有,可以反编译来瞧瞧。
|
首先思路都不对,用户发的消息应该存在服务器里(其实用jsp很方便的,存在application变量里),由客户端定时刷新显示就可以了
|
这样聊天室的响应就会变慢,要是刷新的快的话屏幕就会闪,看着很不舒服。
这样对会使聊天室不好用。
还是推信息到客户端,最少客户端感到舒服,而且是实时的。每秒钟10000条
信息,服务器就不看重负了吗?
我也想知道,结果会怎么样?
不过,163,china都是用的推技术做的。
这样对会使聊天室不好用。
还是推信息到客户端,最少客户端感到舒服,而且是实时的。每秒钟10000条
信息,服务器就不看重负了吗?
我也想知道,结果会怎么样?
不过,163,china都是用的推技术做的。