chen-zyc / loadbalance

负载均衡

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

loadbalance

负载均衡

WeightedScheduler

加权轮询算法

假设有以下3个节点:

       ▅
       ▅
       ▅        ▅
       ▅        ▅
       ▅   ▅   ▅
权重    5    1    3
索引值  0    1    2

WeightedScheduler 每次都会选择权重值最大的节点,对于上面的例子选择的顺序是 0, 0, 0, 2, 0, 2, 0, 1, 2

  • 对于权重值相差比较大的节点,WeightedScheduler 会重复选择同一个节点。

  • Next 方法不会返回权重值为负的节点。

示例:

s := NewWeightedScheduler(BuildNodes([]int{1, 2, 3}))
node := s.Next()
fmt.Println(node.Data.(int))

并发安全的实例:

s := NewSafeWeightedScheduler(BuildNodes([]int{1, 2, 3}))
node := s.Next()
fmt.Println(node.Data.(int))

NginxScheduler

NginxScheduler nginx 上使用的负载均衡算法。

每次调用 Next 方法返回的节点的权重都会减去所有节点的有效权重之和,因此对于权重值相差比较大的节点也能有较好的均衡效果。

  • Next 每次都会遍历所有节点,因此性能上有所损失。

示例:

s := NewNginxScheduler(BuildNodes([]int{1, 2, 3}))
node := s.Next()
fmt.Println(node.Data.(int))

并发安全的示例:

s := NewSafeNginxScheduler(BuildNodes([]int{1, 2, 3}))
node := s.Next()
fmt.Println(node.Data.(int))

性能测试

BenchmarkNginxScheduler_Next-4      	100000000	        11.6 ns/op	       0 B/op	       0 allocs/op
BenchmarkWeightedScheduler_Next-4   	300000000	         5.50 ns/op	       0 B/op	       0 allocs/op

可视化

通过 web 页面查看各负载均衡算法的选择效果 点击

About

负载均衡

License:Apache License 2.0


Languages

Language:Go 100.0%