tencent2012笔试题附加题

danveno 2011-10-09 11:08:20
加精
问题描述: 例如手机朋友网有n个服务器,为了方便用户的访问会在服务器上缓存数据,因此用户每次访问的时候最好能保持同一台服务器。已有的做法是根据ServerIPIndex[QQNUM%n]得到请求的服务器,这种方法很方便将用户分到不同的服务器上去。但是如果一台服务器死掉了,那么n就变为了n-1,那么ServerIPIndex[QQNUM%n]与ServerIPIndex[QQNUM%(n-1)]基本上都不一样了,所以大多数用户的请求都会转到其他服务器,这样会发生大量访问错误。

问: 如何改进或者换一种方法,使得:(1)一台服务器死掉后,不会造成大面积的访问错误,(2)原有的访问基本还是停留在同一台服务器上;(3)尽量考虑负载均衡。

大家讨论一下吧。
...全文
8439 133 打赏 收藏 转发到动态 举报
写回复
用AI写文章
133 条回复
切换为时间正序
请发表友善的回复…
发表回复
码隆 2011-11-23
  • 打赏
  • 举报
回复
顶起,终于看到一些技术的问题了,时刻关注
wks342639355 2011-11-16
  • 打赏
  • 举报
回复
自我感觉可以用 QQNUM%n,出现问题后 (QQNUM %n) %(n-1),好像可以满足条件
wen_jasmine 2011-11-14
  • 打赏
  • 举报
回复
分布式哈希表可以实现,后继结点接受坏掉节点的数据,设置虚拟节点来保持负载均衡
francisdr 2011-11-04
  • 打赏
  • 举报
回复
等待思路,关注中
shishan3595 2011-11-03
  • 打赏
  • 举报
回复

学到很多东西,很多想法啊
pangqiyang 2011-11-03
  • 打赏
  • 举报
回复
一个简单的解法如下:

#define SERVER_NUM 100

int status[SERVER_NUM]; //1表示有效,0表示无效
int server[SERVER_NUM];

void init(void)
{
int i;

for(i=0;i<SERVER_NUM;++i)
{
status[i]=1;
server[i]=i;
}
}

int get_server(int num)
{
int i,index,server_cnt;

index = num % SERVER_NUM;

for(i=0;i<SERVER_NUM;++i)
{
if((index == i) && status[i])
return i; //Server有效,返回原来的链接
}

server_cnt = 0;
for(i=0;i<SERVER_NUM;++i)
{
if(status[i])
server[server_cnt++] =i ;
else
continue;
}
if (server == 0)
return -1;
//至此server的前server_cnt个元素存储了目前有效的Server
index = num % server_cnt;
return server[index];
}
jiangbin00cn 2011-11-01
  • 打赏
  • 举报
回复
1. 服务器设置两个数组,A用于记录所有的服务器,B用于记录所有可用服务器,位图C用于记录该服务器是否可用
2. 用 i=QQNUM%n 计算服务器
3. 判断服务器A[i]是否可用
4. 若不可用,计算j=QQNUM%m(当前可用服务器)
5. 将数据发送到服务器B[j]
qwer_boo 2011-10-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yanghehong 的回复:]

引用楼主 danveno 的回复:
问题描述: 例如手机朋友网有n个服务器,为了方便用户的访问会在服务器上缓存数据,因此用户每次访问的时候最好能保持同一台服务器。已有的做法是根据ServerIPIndex[QQNUM%n]得到请求的服务器,这种方法很方便将用户分到不同的服务器上去。但是如果一台服务器死掉了,那么n就变为了n-1,那么ServerIPIndex[QQNUM%n]与Serve……
[/Quote]
gzq23525188 2011-10-28
  • 打赏
  • 举报
回复
看不懂
benismway 2011-10-28
  • 打赏
  • 举报
回复
这个问题在实际应用中其实不应该是由客户端来进行均衡.服务器down掉的情况,一般采用的是负载均衡器来调配的,而不应该是通过客户端来找具体服务器.因为架构服务器的时候应该就不是对客户端透明的.

不过这是个面试题的话,看题目的意思应该是想问发生这种情况的时候在客户端如何进行均衡,那就用一致性哈希来解决比较好了.
sgzlove2007 2011-10-27
  • 打赏
  • 举报
回复
第一次路由还是用N来哈希路由,坏掉的服务器作为一个虚拟节点,把落入这个虚拟节点的用户再N-1哈希或者分配到一个新的服务器上
lichao20073877 2011-10-26
  • 打赏
  • 举报
回复
看到一个有关consistent hashing的介绍,觉得应该可以
http://hbluojiahui.blog.163.com/blog/static/31064767201098114026211/
dlut_coco 2011-10-26
  • 打赏
  • 举报
回复
关注一下
谢耳朵 2011-10-25
  • 打赏
  • 举报
回复
学习了
d604060189 2011-10-25
  • 打赏
  • 举报
回复
一致性 hash 长见识
nand库路泽 2011-10-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 chen_wenyue 的回复:]

想了个算法,在将用户分配到服务器时,做一层映射,映射与服务器一对一对应,当服务器异常时,对应的映射表项执行顺序在其它服务器中选路,简单有效。呵呵。。。示例代码如下,供大家参考,欢迎有更好的方法与大家分享
C/C++ code

#include <iostream>
#include <time.h>

#define MAX_SERVER 200

int server_ip[MAX……
[/Quote]真的好强大!!
beautifulcool_9686 2011-10-19
  • 打赏
  • 举报
回复
顶一下
beautifulcool_9686 2011-10-19
  • 打赏
  • 举报
回复
顶一下
b13272012771 2011-10-19
  • 打赏
  • 举报
回复
mark,标记后学习
poly3 2011-10-19
  • 打赏
  • 举报
回复
各路高手。。。
加载更多回复(113)

33,016

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧