首页
新闻
论坛
群组
Blog
文档
下载
读书
Tag
网摘
搜索
.NET
Java
游戏
视频
人才
外包
培训
数据库
书店
程序员
欢迎您:
游客
| 退出
| 登录
注册
帮助
我的帖子
我参与的帖子
我的空间
我的网摘
CSDN
CSDN社区
Java
J2SE / 基础类
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
生成帖子
置顶
推荐(加精)
取消推荐(加精)
锁定帖子
移动帖子
取消引用
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛
Socket连接登陆服务器用户信息数据的维护
[已结贴,结贴人:jiangguilong2000]
加为好友
发送私信
在线聊天
jiangguilong2000
流子
等级:
可用分等级:
短工
总技术分:
280
总技术分排名:
48314
揭贴率:
64.58%
发表于:
2008-08-19 23:45:22
楼主
问题:对数据库的数据user是实时读取(客户端连接登陆服务器)还是定时(比如5分钟)读取一次进登陆服务器的内存中?
图示:
描述:为了让登陆服务器,大厅服务器,游戏逻辑服务器==这些服务器不直接对数据库服务器进行操作,提高数据的安全性,使得我们对数据库的操作成为了异步,我们建了一个DBProxy server,相当于建立了一个提供web service功能的server,与该server的通信也是通过socket 连接请求,如果数据库中有一张表,表名为User,里面是包含账号和password等信息,
这样,引出了一个问题:对数据库的数据user(假设有10w条记录)是实时读取(客户端连接登陆服务器时,登陆服务器再向dbproxy发请求)还是定时(比如5分钟)读取一次进登陆服务器的内存中?
分析了一下,两种方式做的优缺点:
1.如果实时读取,好处为:
1.1.用户一旦注册完成马上就可以登陆,用户账号即时生效
1.2.登陆服务器中所占用的user内存空间都可以省去
那么和DBProxy连接方式可为长连接或者短连接,如果只保持一个长连接,因为是异步请求,所以当返回相应用户信息的时候,很难把结果发给相应的客户端socket连接,这个结果需要包含有客户端的IP和port连接信息。
如果只保持短连接,那么每次客户端有登陆 ,就需要创建一次和DBProxy连接,通讯,断开,这就需要在一个连接中(登陆服务器和客户端的连接)创建一个新的连接(以登陆服务器为客户端,dbproxy 为服务端)
2.如果定时去读取所有user的信息(账号+密码+其他信息)到登录服务器,在登录服务器内存中维护这些数据
好处是:
1.相应快,通讯简单,各个连接的耦合性断开
缺点是:账号不能即时生效,最小也要n分钟左右
2.需要和DBProxy始终保持一个长连接
3.登录服务器中的内存中始终要维护这张表,耗空间,当用户量巨大时怎么办,比如10W,100W
各路英雄,小弟写的比较口语化,不知有没有看懂,希望你们提高见!如果分数不够,再加!
问题点数:
100
回复次数:
11
显示所有回复
显示星级回复
显示楼主回复
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
allenney
幽深
等级:
可用分等级:
贫农
总技术分:
310
总技术分排名:
45213
发表于:
2008-08-20 05:20:38
1
楼 得分:
20
想不明白为什么楼主要把用户信息放到内存里面,这样如果一旦机器当掉岂不是会造成数据的丢失?另外,就像你自己说的,如果数据量大了以后,服务器的负担会非常的大。可能有这样想法的原因就只有一个,当用户登录的时候效率会高很多。当然,内存的速度要远远超过硬盘,这个是大家都知道的事情,但是,就是一个简单的登录校验的话,我想速度也不会慢到哪里去的。即使是百万级别的表,通过主键搜索也是非常快的。对于用户来说0.01秒的响应时间和0.1秒的响应时间是没有太大的差别的。甚至,如果用户实在是太多了,对效率的要求是实在是非常高,也可以把数据库中的user表分段保存。控制每个字表的大小。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
jiangguilong2000
流子
等级:
可用分等级:
短工
总技术分:
280
总技术分排名:
48314
发表于:
2008-08-20 09:05:31
2
楼 得分:
0
引用 1 楼 allenney 的回复:
想不明白为什么楼主要把用户信息放到内存里面,
这样如果一旦机器当掉岂不是会造成数据的丢失?
另外,就像你自己说的,如果数据量大了以后,服务器的负担会非常的大。可能有这样想法的原因就只有一个,当用户登录的时候效率会高很多。当然,内存的速度要远远超过硬盘,这个是大家都知道的事情,但是,就是一个简单的登录校验的话,我想速度也不会慢到哪里去的。即使是百万级别的表,通过主键搜索也是非常快的。对于用户来说0.01秒…
数据应该不会丢失,因为它是每隔几分钟向数据库某张表去请求数据,然后是临时保存在登录服务器的内存中。 为什么要这样做,是因为中间加了个代理数据库服务器DBProxy,导致数据查询为异步(不是查询后就等待返回,而是放到发往代理数据库服务器DBProxy的一个消息队列中去)
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
zhao_tk
等级:
可用分等级:
中农
总技术分:
1118
总技术分排名:
17857
发表于:
2008-08-20 10:00:21
3
楼 得分:
15
缺点是:账号不能即时生效,最小也要n分钟左右
很明显,没有大的使用价值
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
preferme
等级:
可用分等级:
富农
总技术分:
2757
总技术分排名:
7692
发表于:
2008-08-20 11:07:17
4
楼 得分:
21
LZ表述的内容太多了,没有明确表述出你想达到的目的。每种方法,都有其有点和缺点。
首先,LZ说的“实时读取”,我不推荐使用,虽然,通过登录超时就能解决身份验证响应慢的问题。但是,那就失去了将Login Server独立出来的目的了。
从整个系统的架构上来考虑,身份验证模块没有集成在那个什么大厅服务器或者游戏逻辑服务器上的原因,应该是考虑到了,
快速的身份验证以及数据的可维护性。一般的设计思路,是在LoginServer上面创建一个只读缓存,然后,身份验证时从缓存中提取数据,
缓存一般采用定时刷新的方式来更新数据。因为,每次刷新,交互的数据量很大,并且数据刷新的同时不能做身份验证,所以,刷新的频率是非常低的。
刷新缓存的目的,是让新注册的用户或者恢复使用的用户,让其信息更新到缓存中,其实,不刷新的话,老用户是没有问题可以登录的。
新用户可以等一等再来登录,想玩游,干嘛还要在意多等几分钟时间?
一般情况下,都是采用LZ说的“定时读取”的方式。并且,这个读取频率是可以动态调节的。当用户量较小时,频率高一些,用户量大时,频率低些。
其次,一个系统,在设计的时候,就是要考虑到容量问题的。最多支持多少人同时在线。人数太多的时候,可能要用到多台服务器做身份验证。
不一定所有用户的验证信息都缓存在内存当中,虽然,都缓存到内存,性能要高,但是,内存容量是有限的,并且,
并不是所有注册过的用户都频繁的来进行登录验证,也可能,10W用户,经常登录的就1W左右,那,剩余的8W多的缓存空间,并没有有效利用。
我们可以让不经常登录的用户,激活以后再登录,没激活的不活跃用户,其信息不缓存到内存当中。
我们可以多配备几台LoginServer,每台LogingServer,只缓存一部分的验证信息。当登录请求到达以后,所有的LoginServer同时开始做身份验证,
当其中一台验证成功就登录成功,否则,登录不成功。
LoginServer上面也可以安装 数据库系统 的软件,辅助进行工作。
最后,LoginServer可以设计一个只刷新某部分数据的功能,当有新用户注册成功后,由DBProxy通知LoginServer,某用户可以进行身份验证。
这时,LoginServer将通知信息当中的该用户的身份验证信息更新到缓存当中去,就可以完成,注册即登录的功能了。
希望,我罗嗦的这些能够给LZ一些启发。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
jiangguilong2000
流子
等级:
可用分等级:
短工
总技术分:
280
总技术分排名:
48314
发表于:
2008-08-20 12:13:35
5
楼 得分:
0
引用 4 楼 preferme 的回复:
LZ表述的内容太多了,没有明确表述出你想达到的目的。每种方法,都有其有点和缺点。
首先,LZ说的“实时读取”,我不推荐使用,虽然,通过登录超时就能解决身份验证响应慢的问题。但是,那就失去了将Login Server独立出来的目的了。
从整个系统的架构上来考虑,身份验证模块没有集成在那个什么大厅服务器或者游戏逻辑服务器上的原因,应该是考虑到了,
快速的身份验证以及数据的可维护性。…
谢谢你的回复!你的想法和我目前的想法基本一致!但这个想法在可行性上不知是否可行,我有以下疑问:
1.上述的方法是否已经在实际应用?
2.我提到的“实时读取”,可能字面上有些偏误,我所指的是类似阻塞式读取,就是查询数据库时,直到返回结果程序才能继续执行下去。
3.对于刷新频率的控制似乎有点难度。
4.你提到的“我们可以让不经常登录的用户,激活以后再登录,没激活的不活跃用户,其信息不缓存到内存当中。”如何激活,在另外的网页上?目前的游戏大厅似乎可以允许你几个月不上线,几个月后登录并不需要激活这一操作,我们是不是走了弯路?
5.“我们可以多配备几台LoginServer,每台LogingServer,只缓存一部分的验证信息。当登录请求到达以后,所有的LoginServer同时开始做身份验证,当其中一台验证成功就登录成功,否则,登录不成功。 ”目前的游戏大厅的用户登录应该是这样实现的:一个用户自己选择其中一登录服务器,如果该服务器负载已经饱和,它会让你连到另外的登录服务器让你登录,如果没有饱和,那么就执行登录请求,而不是多台LoginServer同时验证,那么就失去了分布式架构的初衷了。
6.“LoginServer上面也可以安装 数据库系统 的软件,辅助进行工作。”我觉得不是很好,这样会把数据库暴露在外,安全性降低。
再次感谢preferme,你总能很了解我的疑问。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
allenney
幽深
等级:
可用分等级:
贫农
总技术分:
310
总技术分排名:
45213
发表于:
2008-08-20 18:55:38
6
楼 得分:
15
设计程序的时候是不能考虑“新用户可以等一等再来登录,想玩游,干嘛还要在意多等几分钟时间? ”这样的问题的。这只是你的一种假设。
我个人觉得可能大家是把这个简单的问题想的太复杂了。最多在数据库端做个集群,完全没必要把架构弄得这么复杂。环节越多,出问题的概率越大。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
preferme
等级:
可用分等级:
富农
总技术分:
2757
总技术分排名:
7692
发表于:
2008-08-20 19:41:11
7
楼 得分:
25
1.定时刷新技术,已经在实际当中应用了,但是,具体的实现方式,我还不知道。只是在网游私服上遇到过。
2.明白LZ的意思,但是,客户端要有登录超时的处理,否则,可能会出问题。
3.刷新频率,要靠实际的情况来决定的,这要按实际情况试才行。但,可以动态调整,是可以实现的。
4.对于不活跃用户的激活,可以另外在网页上完成,也可以通过用户登录来完成。我说的这个方法,就好象CPU的发展史一样,一开始只有一个Cache,
后来又有了二级缓存。通过登录来完成的意思就是说,不活跃的用户在其登录的时候,先到内存验证登录信息,如果没有,在到二级缓存中校验登录信息,
如果用户存在要将不活跃用户更为活跃用户。而所谓的二级缓存可以以其他形式的存储设备来实现,或者,通过DBProxy来实现也可以。
5.我和LZ的思想上面,可能有些误差。我所说的LoginServer,是专门用于身份验证的。而至于选择哪个游戏逻辑服务器,是另外一回事。
就那登录QQ游戏大厅来说吧。你在运行QQ游戏大厅的时候,要求输入QQ号码和密码对吧。输入完成以后,就应该是身份验证这一步了。
登录成功以后,客户端应该拿到的,是一个有效身份的令牌。如果,想要进入哪个游戏逻辑服务器,那么,你就拿着令牌往进闯就行了。
至于,那个什么人数已满,自动选择人数少的,这些功能,应该是大厅服务器(或客户端程序)来辅助完成。
游戏逻辑服务器的登录,只校验令牌的有效性就可以了。这比身份验证要简单的多。如果不理解令牌,那,通行证应该更通俗一些。
6.我所说的“LoginServer上面也可以安装 数据库系统 的软件,辅助进行工作。”,和LZ那个图片中的DB,是不相同的。
LoginServer上的数据库,可以用其充当二级缓存。这个数据库,和整个系统的数据库,是严格分离的。
比如,系统开发的时候,使用的是全部用户缓存到内存当中,进行身份验证。随着时间推移,用户量太多,内存马上就要暴掉。
保守的解决方案,就是,用数据库充当缓存。虽然,速度会慢,但是,可以解决问题。在此基础上的优化方案就是,将不活跃用户保存到数据库中,
活跃用户保存到内存当中。当然,为LogingServer增加内存,也是解决方案之一。如果,内存已经达到最大值了、还要使用内存缓存这种方式,
那就要多台LoginServer同时校验,每台LoginServer只缓存一部分的用户数据(所有LoginServer的数据,构成全体的数据),为了系统好设计,
在众多的LoginServer的前端,放置一个FacadeLoginServer,相当于一个代理登录验证服务器,用户的登录请求都发送给FacadeLoginServer,
具体的身份验证,要FacadeLoginServer向其他LoginServer发送信息,协调解决。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
wrong1111
等级:
可用分等级:
中农
总技术分:
529
总技术分排名:
31154
发表于:
2008-08-20 20:12:42
8
楼 得分:
1
学习,,,,,,,,
说得很好!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
wrong1111
等级:
可用分等级:
中农
总技术分:
529
总技术分排名:
31154
发表于:
2008-08-20 20:12:43
9
楼 得分:
1
学习,,,,,,,,
说得很好!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
wrong1111
等级:
可用分等级:
中农
总技术分:
529
总技术分排名:
31154
发表于:
2008-08-20 20:12:47
10
楼 得分:
1
学习,,,,,,,,
说得很好!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
zq620901
zhangqian620901@yahoo.com.cn
等级:
可用分等级:
中农
总技术分:
87
总技术分排名:
97311
发表于:
2008-08-25 11:27:55
11
楼 得分:
1
学习
修改
删除
举报
引用
回复
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛
网站简介
-
广告服务
-
网站地图
-
帮助
-
联系方式
-
诚聘英才
-
English
-
问题报告
北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
abc推荐给好友