设计一个中转的消息服务器的负载均衡算法

hzhxxx 2009-11-12 12:30:13
//一个中转的消息服务器下面挂了很多(1~N)业务服务器,设计一个负载均衡算法
//1。 N 个服务器中的任何一台服务器可能死机,死机的机器不能分发(死机的机器会被通知,复活后也会通知)
//2。 N 个服务器中的其中任何一台都可以分配负载 0~100,可以比例对各台业务服务器分配负载
//3。 能快速的选择到一台负载机器进行分配并能快速的响应负载机器的退出和加入
//4。 可用 java 和 C++ 实现
...全文
313 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzhxxx 2009-11-27
  • 打赏
  • 举报
回复


这个算法还有个问题,
如果有K台机器,则M=(K和max的最小公倍数).

这样算出的 M 并不是一个很合适的值,不能很好的保证每个服务器最小能分到 1/M
WingForce 2009-11-26
  • 打赏
  • 举报
回复
DHT
Blue_may 2009-11-26
  • 打赏
  • 举报
回复
用一致性hash怎么样。即使死机数据便宜量也很小。
aizibion 2009-11-26
  • 打赏
  • 举报
回复
不知道楼主考虑过一条消息不能构成一次完整业务得情况没有,如果每条消息确定是一个完整流程,当我啥都没说。
哇呜 2009-11-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zsxcn 的回复:]
把业务服务器的编号放在一个队列当中,每次取出队列头部的业务服务器,把消息转发给他,同时把该服务器放到队列尾部。当服务器死机的时候,从队列中删除该服务器,当服务器重启的时候,加入队列尾部。
[/Quote]
--------------------------------------
比较同意这个算法,简单。
也可以不用队列,用一个数组也可以,比如固定100个元素的数组(假设服务器数量远小于100台),然后按各服务器的权重,将各服务器的标识填到数组中即可。如果有服务器加入或退出,更新一下这个数组就可以。
至于消息的分发,可以考虑轮询的方式一个一个数组元素来;也可以考虑按消息类型或其他信息计算出一个0~99的HASH值;当然还可以根据需要选用各种各样的方法。
虽然效果不一定是最好,但应该是很容易实现的。先做出来用着,然后再想其他更好的方案,呵呵:)

至于故障检测,应该有现成的网络协议或者其它检测手段,比如常见的HELLO机制等。
thy38 2009-11-26
  • 打赏
  • 举报
回复
这有啥啊?不就是建个堆呗
icosagon 2009-11-26
  • 打赏
  • 举报
回复
权重是小数,都乘个100000之类的变成整数
icosagon 2009-11-26
  • 打赏
  • 举报
回复
说清楚点
比如服务器1权重 43
2的权重 89
3的权重54

取随机数 对43+89+54取模, 如果得66,则在 43-(43+88)的范围内, 当然就扔给服务器2了。
icosagon 2009-11-26
  • 打赏
  • 举报
回复
算出每个服务器的权重,所有权重加起来,取一个随机数,取模,看在哪个服务器的权重范围里。


或者直接使用使用权重作随机种子的随机函数。
hzhxxx 2009-11-26
  • 打赏
  • 举报
回复

* 一个服务集群,负载算法是全部的load balance值N相加得到一个分母M,创建一个元素个数是
* M的分配数组A,A里面存储单个服务器的配置.如果某个服务器的N值是N1,则占数组里面的N1份.由一个随机数模除M,得到一个A的索引值INDEX
* ,A[INDEX]就是所要的服务配置.设定每个服务器 N后,可以得到N里面的最大的那个值max,如果有K台机器,则M=(K和max的最小公倍数).


更新一下描述,大家更容易理解
owenlzb2004 2009-11-26
  • 打赏
  • 举报
回复
楼主不用那么失望
hzhxxx 2009-11-26
  • 打赏
  • 举报
回复
一个服务集群,负载算法是全部的load balance值相加得到一个分母M,用这个分母值创建一个元素个数是M的分配数组,每个load
* balance是这个数组里面的一分子,如果load balance
* 是N(1<=N<=MAX),则占数组里面的N份,由一个随机数模除N,得到一个数组的索引值INDEX
* ,取出INDEX里面的服务。如果有K台机器,则M=(K和MAX的最小公倍数)。

还是自己设计一个算法吧,对 csdn 有点失望了..........
hzhxxx 2009-11-15
  • 打赏
  • 举报
回复

还没有一些好的算法和思路啊
do_fork 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hzhxxx 的回复:]
这个只是设计算法,不是设计架构,哈,各位多心了,其实一个消息服务器器下面挂100 个业务服务器也算非常多了,实际情况也就2台到5台
[/Quote]

把调度和负载均衡的部分封装起来,先用最简单的方式实现,不能满足性能的时间再改进
lijuntao1027 2009-11-13
  • 打赏
  • 举报
回复
关注
zsxcn 2009-11-13
  • 打赏
  • 举报
回复
把业务服务器的编号放在一个队列当中,每次取出队列头部的业务服务器,把消息转发给他,同时把该服务器放到队列尾部。当服务器死机的时候,从队列中删除该服务器,当服务器重启的时候,加入队列尾部。
hzhxxx 2009-11-13
  • 打赏
  • 举报
回复
这个只是设计算法,不是设计架构,哈,各位多心了,其实一个消息服务器器下面挂100 个业务服务器也算非常多了,实际情况也就2台到5台
hzhxxx 2009-11-12
  • 打赏
  • 举报
回复

各位只是提供了一点思路,其实并没有大家说的那么大规模,你想一个消息分发下面能挂多少业务服务器,最多 10000 台了吧,所以其实是小规模。

  • 打赏
  • 举报
回复
大规模检测的模型,一般都是以堆为基础。
jackyjkchen 2009-11-12
  • 打赏
  • 举报
回复
所谓负载均衡,就是链接池+排序算法,根据链接池里的链接量排序,找出最空闲的链接
加载更多回复(7)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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