1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-24 04:22:22 +00:00

update lb

This commit is contained in:
Xargin 2018-05-31 22:01:57 +08:00
parent 2843948025
commit ea4fa0b695
2 changed files with 12 additions and 2 deletions

View File

@ -44,6 +44,7 @@
* [6.3. Middleware中间件](ch6-web/ch6-03-middleware.md)
* [6.4. Validator请求校验](ch6-web/ch6-04-validator.md)
* [6.5. Database和数据库打交道](ch6-web/ch6-05-database.md)
* [6.8. Layout大型web项目分层](ch6-web/ch6-08-layout-of-web-project.md)
* [附录](appendix/readme.md)
* [附录A: Go语言常见坑](appendix/appendix-a-trap.md)
* [附录B: 参考资料](appendix/appendix-b-ref.md)

View File

@ -76,8 +76,17 @@ func request(params map[string]interface{}) error {
2. 洗牌不均匀,会导致整个数组第一个节点有大概率被选中,并且多个节点的负载分布不均衡。
第一点比较简单,应该不用在这里给出证明了。关于第二点,我们可以用概率知识来简单证明一下。假设
第一点比较简单,应该不用在这里给出证明了。关于第二点,我们可以用概率知识来简单证明一下。假设每次挑选都是真随机,我们假设第一个位置的 endpoint 在 len(slice) 次交换中都不被选中的概率是 ((6/7)*(6/7))^7 ≈ 0.34。而分布均匀的情况下,我们肯定希望被第一个元素在任意位置上分布的概率均等,所以其被随机选到的概率应该 ≈ 1/7 ≈ 0.14。
## 修正后的负载均衡算
显然,这里给出的洗牌算法对于任意位置的元素来说,有 30% 的概率不对其进行交换操作。所以所有元素都倾向于留在原来的位置。因为我们每次对 shuffle 数组输入的都是同一个序列,所以第一个元素有更大的概率会被选中。在负载均衡的场景下,也就意味着 endpoints 数组中的第一台机器负载会比其它机器高不少(这里至少是 3 倍以上)。
## 修正后的洗牌算法
从数学上得到过证明的还是经典的 fisher-yates 算法,在 Go 的标准库中实际上已经为我们内置了该算法:
```go
```
## zk 集群的随机节点挑选问题
## 故障节点摘除