为了账号安全,请及时绑定邮箱和手机立即绑定

用于以预定义比率循环服务器的 Go 算法

用于以预定义比率循环服务器的 Go 算法

Go
江户川乱折腾 2021-08-16 19:51:02
我正在尝试制作一种算法,该算法可以按预定义的比率循环真实事物,在我的情况下是后端服务器。例如我有 2 个后端服务器type server struct {    addr string    ratio float64    counter int64}// s2 is a beast and may handle 3 times the requests then s1 *edits1 := &server{":3000", 0.25}s2 := &server{":3001", 0.75}func nextServer() {    server := next() // simple goroutine that provides the next server between s1 and s2    N := server.counter / i    if float64(N) > server.ratio {        //repeat this function        return nextServer()    }    server.counter += 1}    for i := 0; i < 1000; i++ {    nextServer()}s1 有 250 作为计数器(处理的请求)s2 很大,所以他有 750 作为计数器(请求处理)这是我得到的一个非常简单的实现,但是当我像 10000 时,它会在 nextServer() 中不断循环,因为 N 总是 > server.ratio。只要我在 5000 左右,它就完美无缺。但我认为有更好的算法来循环比率。如何使这个简单而扎实?
查看完整描述

1 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

像这样的东西?


package main


import (

    "fmt"

    "math/rand"

)


type server struct {

    addr  string

    ratio float64

}


var servers []server


func nextServer() *server {

    rndFloat := rand.Float64() //pick a random number between 0.0-1.0

    ratioSum := 0.0

    for _, srv := range servers {

        ratioSum += srv.ratio //sum ratios of all previous servers in list

        if ratioSum >= rndFloat { //if ratiosum rises above the random number

            return &srv //return that server

        }

    }

    return nil //should not come here

}


func main() {

    servers = []server{server{"0.25", 0.25}, server{"0.50", 0.50}, 

            server{"0.10", 0.10}, server{"0.15", 0.15}}


    counts := make(map[string]int, len(servers))

    for i := 0; i < 100; i++ {

        srv := nextServer()

        counts[srv.addr] += 1

    }

    fmt.Println(counts)

}

产量例如:


map[0.50:56 0.15:15 0.25:24 0.10:5]


查看完整回答
反对 回复 2021-08-16
  • 1 回答
  • 0 关注
  • 178 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信