首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • Socket连接登陆服务器用户信息数据的维护 [已结贴,结贴人:jiangguilong2000]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jiangguilong2000
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于: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  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • allenney
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 05:20:381楼 得分:20
    想不明白为什么楼主要把用户信息放到内存里面,这样如果一旦机器当掉岂不是会造成数据的丢失?另外,就像你自己说的,如果数据量大了以后,服务器的负担会非常的大。可能有这样想法的原因就只有一个,当用户登录的时候效率会高很多。当然,内存的速度要远远超过硬盘,这个是大家都知道的事情,但是,就是一个简单的登录校验的话,我想速度也不会慢到哪里去的。即使是百万级别的表,通过主键搜索也是非常快的。对于用户来说0.01秒的响应时间和0.1秒的响应时间是没有太大的差别的。甚至,如果用户实在是太多了,对效率的要求是实在是非常高,也可以把数据库中的user表分段保存。控制每个字表的大小。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jiangguilong2000
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 09:05:312楼 得分:0
    引用 1 楼 allenney 的回复:
    想不明白为什么楼主要把用户信息放到内存里面,这样如果一旦机器当掉岂不是会造成数据的丢失?另外,就像你自己说的,如果数据量大了以后,服务器的负担会非常的大。可能有这样想法的原因就只有一个,当用户登录的时候效率会高很多。当然,内存的速度要远远超过硬盘,这个是大家都知道的事情,但是,就是一个简单的登录校验的话,我想速度也不会慢到哪里去的。即使是百万级别的表,通过主键搜索也是非常快的。对于用户来说0.01秒…

    数据应该不会丢失,因为它是每隔几分钟向数据库某张表去请求数据,然后是临时保存在登录服务器的内存中。 为什么要这样做,是因为中间加了个代理数据库服务器DBProxy,导致数据查询为异步(不是查询后就等待返回,而是放到发往代理数据库服务器DBProxy的一个消息队列中去)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhao_tk
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 10:00:213楼 得分:15

    缺点是:账号不能即时生效,最小也要n分钟左右 

    很明显,没有大的使用价值
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • preferme
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 11:07:174楼 得分:21
    LZ表述的内容太多了,没有明确表述出你想达到的目的。每种方法,都有其有点和缺点。

    首先,LZ说的“实时读取”,我不推荐使用,虽然,通过登录超时就能解决身份验证响应慢的问题。但是,那就失去了将Login Server独立出来的目的了。
        从整个系统的架构上来考虑,身份验证模块没有集成在那个什么大厅服务器或者游戏逻辑服务器上的原因,应该是考虑到了,
        快速的身份验证以及数据的可维护性。一般的设计思路,是在LoginServer上面创建一个只读缓存,然后,身份验证时从缓存中提取数据,
        缓存一般采用定时刷新的方式来更新数据。因为,每次刷新,交互的数据量很大,并且数据刷新的同时不能做身份验证,所以,刷新的频率是非常低的。
        刷新缓存的目的,是让新注册的用户或者恢复使用的用户,让其信息更新到缓存中,其实,不刷新的话,老用户是没有问题可以登录的。
        新用户可以等一等再来登录,想玩游,干嘛还要在意多等几分钟时间?
        一般情况下,都是采用LZ说的“定时读取”的方式。并且,这个读取频率是可以动态调节的。当用户量较小时,频率高一些,用户量大时,频率低些。
    其次,一个系统,在设计的时候,就是要考虑到容量问题的。最多支持多少人同时在线。人数太多的时候,可能要用到多台服务器做身份验证。
        不一定所有用户的验证信息都缓存在内存当中,虽然,都缓存到内存,性能要高,但是,内存容量是有限的,并且,
        并不是所有注册过的用户都频繁的来进行登录验证,也可能,10W用户,经常登录的就1W左右,那,剩余的8W多的缓存空间,并没有有效利用。
        我们可以让不经常登录的用户,激活以后再登录,没激活的不活跃用户,其信息不缓存到内存当中。
        我们可以多配备几台LoginServer,每台LogingServer,只缓存一部分的验证信息。当登录请求到达以后,所有的LoginServer同时开始做身份验证,
        当其中一台验证成功就登录成功,否则,登录不成功。
        LoginServer上面也可以安装 数据库系统 的软件,辅助进行工作。
    最后,LoginServer可以设计一个只刷新某部分数据的功能,当有新用户注册成功后,由DBProxy通知LoginServer,某用户可以进行身份验证。
      这时,LoginServer将通知信息当中的该用户的身份验证信息更新到缓存当中去,就可以完成,注册即登录的功能了。

    希望,我罗嗦的这些能够给LZ一些启发。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jiangguilong2000
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 12:13:355楼 得分:0
    引用 4 楼 preferme 的回复:
    LZ表述的内容太多了,没有明确表述出你想达到的目的。每种方法,都有其有点和缺点。

    首先,LZ说的“实时读取”,我不推荐使用,虽然,通过登录超时就能解决身份验证响应慢的问题。但是,那就失去了将Login Server独立出来的目的了。
        从整个系统的架构上来考虑,身份验证模块没有集成在那个什么大厅服务器或者游戏逻辑服务器上的原因,应该是考虑到了,
        快速的身份验证以及数据的可维护性。…

    谢谢你的回复!你的想法和我目前的想法基本一致!但这个想法在可行性上不知是否可行,我有以下疑问:
    1.上述的方法是否已经在实际应用?
    2.我提到的“实时读取”,可能字面上有些偏误,我所指的是类似阻塞式读取,就是查询数据库时,直到返回结果程序才能继续执行下去。
    3.对于刷新频率的控制似乎有点难度。
    4.你提到的“我们可以让不经常登录的用户,激活以后再登录,没激活的不活跃用户,其信息不缓存到内存当中。”如何激活,在另外的网页上?目前的游戏大厅似乎可以允许你几个月不上线,几个月后登录并不需要激活这一操作,我们是不是走了弯路?
    5.“我们可以多配备几台LoginServer,每台LogingServer,只缓存一部分的验证信息。当登录请求到达以后,所有的LoginServer同时开始做身份验证,当其中一台验证成功就登录成功,否则,登录不成功。 ”目前的游戏大厅的用户登录应该是这样实现的:一个用户自己选择其中一登录服务器,如果该服务器负载已经饱和,它会让你连到另外的登录服务器让你登录,如果没有饱和,那么就执行登录请求,而不是多台LoginServer同时验证,那么就失去了分布式架构的初衷了。
    6.“LoginServer上面也可以安装 数据库系统 的软件,辅助进行工作。”我觉得不是很好,这样会把数据库暴露在外,安全性降低。
    再次感谢preferme,你总能很了解我的疑问。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • allenney
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 18:55:386楼 得分:15
    设计程序的时候是不能考虑“新用户可以等一等再来登录,想玩游,干嘛还要在意多等几分钟时间? ”这样的问题的。这只是你的一种假设。

    我个人觉得可能大家是把这个简单的问题想的太复杂了。最多在数据库端做个集群,完全没必要把架构弄得这么复杂。环节越多,出问题的概率越大。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • preferme
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 19:41:117楼 得分: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
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 20:12:428楼 得分:1
    学习,,,,,,,,

    说得很好!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wrong1111
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 20:12:439楼 得分:1
    学习,,,,,,,,

    说得很好!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wrong1111
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 20:12:4710楼 得分:1
    学习,,,,,,,,

    说得很好!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zq620901
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 11:27:5511楼 得分:1
    学习
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved