z***e 发帖数: 5393 | 1 这应该是个常见的design问题,但是不知道怎么才是最好的方式。
打个比方说,服务器有几百万个user,所以用了多个data server,每个data server存
一部分user和相关信息(每个user的相关data很大).这个server存放哪些user并不是固
定的,会根据user的具体情况变化,问题就在于如果user这个具体情况非常频繁地变化的时
候如何有效处理。
user需要不停频繁地update信息,所以不能直接写数据库。那么每次user update的时
候,就会向服务器发网络请求,送出自己的userid和需要update的东西,网络server首先根据
userid找到user所在的data server,然后对该data server发出update请求.
这种情况,网络server就要专门用一个table来map userid<=>data server的关系,感
觉很浪费,有没有更好的方法? |
e****d 发帖数: 895 | 2 you can also hash user ids to data servers.
userid
【在 z***e 的大作中提到】 : 这应该是个常见的design问题,但是不知道怎么才是最好的方式。 : 打个比方说,服务器有几百万个user,所以用了多个data server,每个data server存 : 一部分user和相关信息(每个user的相关data很大).这个server存放哪些user并不是固 : 定的,会根据user的具体情况变化,问题就在于如果user这个具体情况非常频繁地变化的时 : 候如何有效处理。 : user需要不停频繁地update信息,所以不能直接写数据库。那么每次user update的时 : 候,就会向服务器发网络请求,送出自己的userid和需要update的东西,网络server首先根据 : userid找到user所在的data server,然后对该data server发出update请求. : 这种情况,网络server就要专门用一个table来map userid<=>data server的关系,感 : 觉很浪费,有没有更好的方法?
|
z***e 发帖数: 5393 | 3 哦,我没说清楚。network server是接受网络用户请求(比如要update数据),
data server就是存放用户信息(in memory)的server.
每个user对应的server不是固定的,根据条件变化。
我拿wow来打个比方吧,比如一个场景/区域中所有用户都在server 1上,现在有很多
用户非常频繁地切换场景,他的数据就会在server 1/2/3/...上频繁转移。那么我给出一个user
id,要查他在那个地方,就要有一个hashtable/map来存。每次用户的区
域变化了,就会改变server_id.
然后在每个server上,又有这样的东西,这个server还有别的
数据结构,比如当前区域所有玩家列表,就会是一个[userid,userid,userid,...]这样的
list。
所以这个问题是,我要能快速根据userid找到对应的server_id,又要能快速通过
server_id找到在这个server上的所有user.大概是这样。
server.
userid%8 |
h****e 发帖数: 2125 | 4 hash_map >
typedef hash_map >::iterator itertype;
hash_map
u only need to search userid once to find all user ids on a server. need to
be careful with update methods though. not sure whether this is what u want.
..
出一个user
用户的区
样的
【在 z***e 的大作中提到】 : 哦,我没说清楚。network server是接受网络用户请求(比如要update数据), : data server就是存放用户信息(in memory)的server. : 每个user对应的server不是固定的,根据条件变化。 : 我拿wow来打个比方吧,比如一个场景/区域中所有用户都在server 1上,现在有很多 : 用户非常频繁地切换场景,他的数据就会在server 1/2/3/...上频繁转移。那么我给出一个user : id,要查他在那个地方,就要有一个hashtable/map来存。每次用户的区 : 域变化了,就会改变server_id. : 然后在每个server上,又有这样的东西,这个server还有别的 : 数据结构,比如当前区域所有玩家列表,就会是一个[userid,userid,userid,...]这样的 : list。
|
z***e 发帖数: 5393 | 5 嗯,差不多是这个意思,但是就象你说的,update的时候会比较messy,整个table都要
lock住?
还有就是具体需求并不是找list,而是在list里面找符合某些条件的。
我问的意思是这种先通过userid找serverid,然后再在在一个list里面iterate的做法
,是否有更
好的解决方案?
to
want.
【在 h****e 的大作中提到】 : hash_map > : typedef hash_map >::iterator itertype; : hash_map : u only need to search userid once to find all user ids on a server. need to : be careful with update methods though. not sure whether this is what u want. : .. : : 出一个user : 用户的区 : 样的
|