问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎样在IM系统中实现用户在线状态的实时显示

发布网友 发布时间:2022-04-24 05:06

我来回答

1个回答

热心网友 时间:2023-10-30 18:57

据我所知,在MSN系统中,Client首先会连接一个固定的服务器,此服务器会返回一个新的连接服务器地址给Client,而后Client会重新连接到新的务器地址并开始登录。我想这样做是服务器端做到一个负载平衡的功能,也就是说有一个负载平衡服务器,有多个登录服务器。最终Client保持连接的是登录服务鳌
但是如果ClientA连接的是登录服务器A,而CientB连接的是登录服务器B,而ClientA和ClientB是好友,他们的在线状态是怎么得到的?
如果Client的数量比较少,那么登录服务器之间可以传递消息告知对方。但是当上万或者更多的时候。就不应该这样处理了。
那么有什么方式来实现类似的服务器网络结构中Client之间在线状态的实时显示呢?
(wyu2000 AT gmail.com)

正是我现在要面对的问题.

我现在准备采取的策略是:
由客户端主动通知好友。

A 连接到 Login Server A 后。

我们假设A已经从主服务器获得了 好友列表,以及好友状态。

那么A可以主动发送LoginServerA 通知 在线好友B。

LoginServer的通知过程可以用如下方法:
ServerA,检索到好友B的登陆服务器(可以向主服务器请求Client B的登陆服务器,或者可以采用特定的ID算法,根据用户的ID计算出用户B的登陆服务器)
ServerA 发送一个ClientA登陆的消息给Server B,要求ServerB将该消息,转发给 Client B

大家给点意见。

目前我做的IM系统是通过服务器之间转发实现的,想想也没什么更好的办法,理论上每个Server可以达到几万,不过现实中,只有几十个用户/台。

引用

我提个方案:
首先做以下假设:
(1)维护100万在线用户的状态需要多大的内存空间?
(2)从100万在线用户中检索出自己需要的数据需要多少时间?

第一个问题我们可以这样来定性:
设每用户占用的内存空间为:
SessionID会话标识(int)+AccountID用户账号ID(int)+loginTime登录时间(long)+其它状态(假设用4个byte型幢昝4个状态)=20字节
100万用户*20字节=20,000,000(字节)=19,531.25K==19M(约)
注:一条记录就表示一个在线用户;

(我靠,我的计算是不是有错误,一台386的内存都够了.....)
看上去,似乎用一台服务器做状态服务器是没有什么问题的;

第二个问题,我们这样来定性:
假设在服务器端的内存中使用如hashTable这样的存储结构来保存用户的会话状态,hashTable的读操作为0/m复杂度,从100万个记录中读取一条锹嫉难爸肥奔淠鞘窍嗟钡目斓,快到无法用毫秒来计算,只能用tick(一个CPU的时钟滴答)来计算。1个毫秒=10,000个tick(毫微秒),(has环Table的操作平均值是多少我没有统计过不好意思。我就猜个值吧:假设平均为100个tick),如果每次存取hashtable要花费100Tick,另庠诩由弦恍┮滴翊淼氖奔洌桶床僮饕淮问荼硪1个毫秒来计算吧。
那么1秒钟的时间内就可以处理1000次用户的查询操作;
问题是如果100万用户同时来查询我们该怎么办?
我想可以做负载均衡及服务器集群,当然还要涉汲到网络接口的流量*,说来就话很长了。
总之,第二个问题看起来,似乎是我们可以通过其它的手段将单台服务器无法处理的工作量分摊到多台服务器中去进行;

于是可以得出第一个背景结论:
设置一台服务器将其做为用户状态服务器,用于记录系统中所有用户是否在线等状态信息;通过对服务器制作集群来分摊访问压力;

现在我们就可以做以下比较形象的结论和假设了:
(1)一个用户要查询自己所有好友的在线状态,那么这个用户向刚才所说到的状态服务器发送一条查询消息,服务器可以很快的返回用户的状态给客户;
(2)用户在登录系统后通知状态服务器自己已经登陆了。
(3)用户如果从某台具体的功能服务器掉线后,则由这台服务器通知状态服务器用户掉线;
(4)用户可能会在多台功能服务器中来回切换,由客户端与服务器端共同协作以判断用户是为否掉线;
(5)用户定期向状态服务器报告自己的存活状态,如果长时间不报告,则状态服务器把用户从自己的内存状态表中删除;

以上我的瞎解,不一定对,必竞自己没有做过,仅供参考。

热心网友 时间:2023-10-30 18:57

据我所知,在MSN系统中,Client首先会连接一个固定的服务器,此服务器会返回一个新的连接服务器地址给Client,而后Client会重新连接到新的务器地址并开始登录。我想这样做是服务器端做到一个负载平衡的功能,也就是说有一个负载平衡服务器,有多个登录服务器。最终Client保持连接的是登录服务鳌
但是如果ClientA连接的是登录服务器A,而CientB连接的是登录服务器B,而ClientA和ClientB是好友,他们的在线状态是怎么得到的?
如果Client的数量比较少,那么登录服务器之间可以传递消息告知对方。但是当上万或者更多的时候。就不应该这样处理了。
那么有什么方式来实现类似的服务器网络结构中Client之间在线状态的实时显示呢?
(wyu2000 AT gmail.com)

正是我现在要面对的问题.

我现在准备采取的策略是:
由客户端主动通知好友。

A 连接到 Login Server A 后。

我们假设A已经从主服务器获得了 好友列表,以及好友状态。

那么A可以主动发送LoginServerA 通知 在线好友B。

LoginServer的通知过程可以用如下方法:
ServerA,检索到好友B的登陆服务器(可以向主服务器请求Client B的登陆服务器,或者可以采用特定的ID算法,根据用户的ID计算出用户B的登陆服务器)
ServerA 发送一个ClientA登陆的消息给Server B,要求ServerB将该消息,转发给 Client B

大家给点意见。

目前我做的IM系统是通过服务器之间转发实现的,想想也没什么更好的办法,理论上每个Server可以达到几万,不过现实中,只有几十个用户/台。

引用

我提个方案:
首先做以下假设:
(1)维护100万在线用户的状态需要多大的内存空间?
(2)从100万在线用户中检索出自己需要的数据需要多少时间?

第一个问题我们可以这样来定性:
设每用户占用的内存空间为:
SessionID会话标识(int)+AccountID用户账号ID(int)+loginTime登录时间(long)+其它状态(假设用4个byte型幢昝4个状态)=20字节
100万用户*20字节=20,000,000(字节)=19,531.25K==19M(约)
注:一条记录就表示一个在线用户;

(我靠,我的计算是不是有错误,一台386的内存都够了.....)
看上去,似乎用一台服务器做状态服务器是没有什么问题的;

第二个问题,我们这样来定性:
假设在服务器端的内存中使用如hashTable这样的存储结构来保存用户的会话状态,hashTable的读操作为0/m复杂度,从100万个记录中读取一条锹嫉难爸肥奔淠鞘窍嗟钡目斓,快到无法用毫秒来计算,只能用tick(一个CPU的时钟滴答)来计算。1个毫秒=10,000个tick(毫微秒),(has环Table的操作平均值是多少我没有统计过不好意思。我就猜个值吧:假设平均为100个tick),如果每次存取hashtable要花费100Tick,另庠诩由弦恍┮滴翊淼氖奔洌桶床僮饕淮问荼硪1个毫秒来计算吧。
那么1秒钟的时间内就可以处理1000次用户的查询操作;
问题是如果100万用户同时来查询我们该怎么办?
我想可以做负载均衡及服务器集群,当然还要涉汲到网络接口的流量*,说来就话很长了。
总之,第二个问题看起来,似乎是我们可以通过其它的手段将单台服务器无法处理的工作量分摊到多台服务器中去进行;

于是可以得出第一个背景结论:
设置一台服务器将其做为用户状态服务器,用于记录系统中所有用户是否在线等状态信息;通过对服务器制作集群来分摊访问压力;

现在我们就可以做以下比较形象的结论和假设了:
(1)一个用户要查询自己所有好友的在线状态,那么这个用户向刚才所说到的状态服务器发送一条查询消息,服务器可以很快的返回用户的状态给客户;
(2)用户在登录系统后通知状态服务器自己已经登陆了。
(3)用户如果从某台具体的功能服务器掉线后,则由这台服务器通知状态服务器用户掉线;
(4)用户可能会在多台功能服务器中来回切换,由客户端与服务器端共同协作以判断用户是为否掉线;
(5)用户定期向状态服务器报告自己的存活状态,如果长时间不报告,则状态服务器把用户从自己的内存状态表中删除;

以上我的瞎解,不一定对,必竞自己没有做过,仅供参考。

热心网友 时间:2023-10-30 18:57

据我所知,在MSN系统中,Client首先会连接一个固定的服务器,此服务器会返回一个新的连接服务器地址给Client,而后Client会重新连接到新的务器地址并开始登录。我想这样做是服务器端做到一个负载平衡的功能,也就是说有一个负载平衡服务器,有多个登录服务器。最终Client保持连接的是登录服务鳌
但是如果ClientA连接的是登录服务器A,而CientB连接的是登录服务器B,而ClientA和ClientB是好友,他们的在线状态是怎么得到的?
如果Client的数量比较少,那么登录服务器之间可以传递消息告知对方。但是当上万或者更多的时候。就不应该这样处理了。
那么有什么方式来实现类似的服务器网络结构中Client之间在线状态的实时显示呢?
(wyu2000 AT gmail.com)

正是我现在要面对的问题.

我现在准备采取的策略是:
由客户端主动通知好友。

A 连接到 Login Server A 后。

我们假设A已经从主服务器获得了 好友列表,以及好友状态。

那么A可以主动发送LoginServerA 通知 在线好友B。

LoginServer的通知过程可以用如下方法:
ServerA,检索到好友B的登陆服务器(可以向主服务器请求Client B的登陆服务器,或者可以采用特定的ID算法,根据用户的ID计算出用户B的登陆服务器)
ServerA 发送一个ClientA登陆的消息给Server B,要求ServerB将该消息,转发给 Client B

大家给点意见。

目前我做的IM系统是通过服务器之间转发实现的,想想也没什么更好的办法,理论上每个Server可以达到几万,不过现实中,只有几十个用户/台。

引用

我提个方案:
首先做以下假设:
(1)维护100万在线用户的状态需要多大的内存空间?
(2)从100万在线用户中检索出自己需要的数据需要多少时间?

第一个问题我们可以这样来定性:
设每用户占用的内存空间为:
SessionID会话标识(int)+AccountID用户账号ID(int)+loginTime登录时间(long)+其它状态(假设用4个byte型幢昝4个状态)=20字节
100万用户*20字节=20,000,000(字节)=19,531.25K==19M(约)
注:一条记录就表示一个在线用户;

(我靠,我的计算是不是有错误,一台386的内存都够了.....)
看上去,似乎用一台服务器做状态服务器是没有什么问题的;

第二个问题,我们这样来定性:
假设在服务器端的内存中使用如hashTable这样的存储结构来保存用户的会话状态,hashTable的读操作为0/m复杂度,从100万个记录中读取一条锹嫉难爸肥奔淠鞘窍嗟钡目斓,快到无法用毫秒来计算,只能用tick(一个CPU的时钟滴答)来计算。1个毫秒=10,000个tick(毫微秒),(has环Table的操作平均值是多少我没有统计过不好意思。我就猜个值吧:假设平均为100个tick),如果每次存取hashtable要花费100Tick,另庠诩由弦恍┮滴翊淼氖奔洌桶床僮饕淮问荼硪1个毫秒来计算吧。
那么1秒钟的时间内就可以处理1000次用户的查询操作;
问题是如果100万用户同时来查询我们该怎么办?
我想可以做负载均衡及服务器集群,当然还要涉汲到网络接口的流量*,说来就话很长了。
总之,第二个问题看起来,似乎是我们可以通过其它的手段将单台服务器无法处理的工作量分摊到多台服务器中去进行;

于是可以得出第一个背景结论:
设置一台服务器将其做为用户状态服务器,用于记录系统中所有用户是否在线等状态信息;通过对服务器制作集群来分摊访问压力;

现在我们就可以做以下比较形象的结论和假设了:
(1)一个用户要查询自己所有好友的在线状态,那么这个用户向刚才所说到的状态服务器发送一条查询消息,服务器可以很快的返回用户的状态给客户;
(2)用户在登录系统后通知状态服务器自己已经登陆了。
(3)用户如果从某台具体的功能服务器掉线后,则由这台服务器通知状态服务器用户掉线;
(4)用户可能会在多台功能服务器中来回切换,由客户端与服务器端共同协作以判断用户是为否掉线;
(5)用户定期向状态服务器报告自己的存活状态,如果长时间不报告,则状态服务器把用户从自己的内存状态表中删除;

以上我的瞎解,不一定对,必竞自己没有做过,仅供参考。

热心网友 时间:2023-10-30 18:57

据我所知,在MSN系统中,Client首先会连接一个固定的服务器,此服务器会返回一个新的连接服务器地址给Client,而后Client会重新连接到新的务器地址并开始登录。我想这样做是服务器端做到一个负载平衡的功能,也就是说有一个负载平衡服务器,有多个登录服务器。最终Client保持连接的是登录服务鳌
但是如果ClientA连接的是登录服务器A,而CientB连接的是登录服务器B,而ClientA和ClientB是好友,他们的在线状态是怎么得到的?
如果Client的数量比较少,那么登录服务器之间可以传递消息告知对方。但是当上万或者更多的时候。就不应该这样处理了。
那么有什么方式来实现类似的服务器网络结构中Client之间在线状态的实时显示呢?
(wyu2000 AT gmail.com)

正是我现在要面对的问题.

我现在准备采取的策略是:
由客户端主动通知好友。

A 连接到 Login Server A 后。

我们假设A已经从主服务器获得了 好友列表,以及好友状态。

那么A可以主动发送LoginServerA 通知 在线好友B。

LoginServer的通知过程可以用如下方法:
ServerA,检索到好友B的登陆服务器(可以向主服务器请求Client B的登陆服务器,或者可以采用特定的ID算法,根据用户的ID计算出用户B的登陆服务器)
ServerA 发送一个ClientA登陆的消息给Server B,要求ServerB将该消息,转发给 Client B

大家给点意见。

目前我做的IM系统是通过服务器之间转发实现的,想想也没什么更好的办法,理论上每个Server可以达到几万,不过现实中,只有几十个用户/台。

引用

我提个方案:
首先做以下假设:
(1)维护100万在线用户的状态需要多大的内存空间?
(2)从100万在线用户中检索出自己需要的数据需要多少时间?

第一个问题我们可以这样来定性:
设每用户占用的内存空间为:
SessionID会话标识(int)+AccountID用户账号ID(int)+loginTime登录时间(long)+其它状态(假设用4个byte型幢昝4个状态)=20字节
100万用户*20字节=20,000,000(字节)=19,531.25K==19M(约)
注:一条记录就表示一个在线用户;

(我靠,我的计算是不是有错误,一台386的内存都够了.....)
看上去,似乎用一台服务器做状态服务器是没有什么问题的;

第二个问题,我们这样来定性:
假设在服务器端的内存中使用如hashTable这样的存储结构来保存用户的会话状态,hashTable的读操作为0/m复杂度,从100万个记录中读取一条锹嫉难爸肥奔淠鞘窍嗟钡目斓,快到无法用毫秒来计算,只能用tick(一个CPU的时钟滴答)来计算。1个毫秒=10,000个tick(毫微秒),(has环Table的操作平均值是多少我没有统计过不好意思。我就猜个值吧:假设平均为100个tick),如果每次存取hashtable要花费100Tick,另庠诩由弦恍┮滴翊淼氖奔洌桶床僮饕淮问荼硪1个毫秒来计算吧。
那么1秒钟的时间内就可以处理1000次用户的查询操作;
问题是如果100万用户同时来查询我们该怎么办?
我想可以做负载均衡及服务器集群,当然还要涉汲到网络接口的流量*,说来就话很长了。
总之,第二个问题看起来,似乎是我们可以通过其它的手段将单台服务器无法处理的工作量分摊到多台服务器中去进行;

于是可以得出第一个背景结论:
设置一台服务器将其做为用户状态服务器,用于记录系统中所有用户是否在线等状态信息;通过对服务器制作集群来分摊访问压力;

现在我们就可以做以下比较形象的结论和假设了:
(1)一个用户要查询自己所有好友的在线状态,那么这个用户向刚才所说到的状态服务器发送一条查询消息,服务器可以很快的返回用户的状态给客户;
(2)用户在登录系统后通知状态服务器自己已经登陆了。
(3)用户如果从某台具体的功能服务器掉线后,则由这台服务器通知状态服务器用户掉线;
(4)用户可能会在多台功能服务器中来回切换,由客户端与服务器端共同协作以判断用户是为否掉线;
(5)用户定期向状态服务器报告自己的存活状态,如果长时间不报告,则状态服务器把用户从自己的内存状态表中删除;

以上我的瞎解,不一定对,必竞自己没有做过,仅供参考。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? ups电源后备式和在线互动式及在线式是什么意思 java中怎么实现统计从创建账号到现在的在线时间 中国电信在线测网速? 倒计时器,在线等 怎么制作手工立体贺卡? 请问什么手机播放器时间进度条可以看到毫秒级的?视频编辑器也可以, QQ西游在线60个小时是多少毫秒 手工立体孔雀制作方法 网络延迟对在线视频有影响吗 php 哪个函数可以获取当前时间的毫秒值?在线等 动物立体小手工该怎么做? 怎样使客户能够更好的理解在线检测的精度? 立体圆柱怎么做手工制作? 颅内生殖细胞瘤是怎么引起的? 盐酸氟桂利嗪胶囊治疗颅内生殖细胞瘤吗? 颅内生殖细胞瘤引起眼睛复视、斜视和左臂肢体麻木,脸部表情木然!现在肿瘤已消失,要做怎样的锻炼可助恢 颅内松果体区生殖细胞瘤放化疗全部疗程结束后,隔了半年味觉退化至消失(退化前2月复查核磁),是何原因 我家女儿八岁颅内生殖细胞瘤做了放疗要不要化疗 颅内生殖细胞瘤引起颅内出血严重吗 颅内生殖细胞瘤的饮食 网络延迟是145.4000毫秒什么意思 时间换算,在线等~ 电大在线学习计时是在线计时还是第二天系统计时呢? 竞聘岗位,述职报告 制剂实验研究员述职报告 一个公司领导需要和小人里外三刀管人,好吗? 冻蚬子肉炒要不要焯水? 花蚬子炒的时候用不用用水焯一下 蚬子干泡发后要焯水吗 辣炒蚬子用焯水吗 花蚬子焯水冷水还是开水 大黄蚬子怎么做 孕期可以吃西瓜子吗 孕晚期了,孕妇能吃西瓜吗 孕妇吃西瓜子好吗 winzip 软件哪里有免费的, 谢谢! winzip免费版?哪里有的下 WinZip是干什么的软件啊? 最新的winzip怎么破解 IBM T41 标准配置