Я связываюсь в течение нескольких дней, чтобы создать алгоритм, который может обрабатывать истинные вещи, бэкэнд-сервер в моем случае с помощью заданного отношения.Идёт алгоритм для циклических серверов с проксимированием в предопределенном соотношении
, например, я получил 2 Серверные серверы
type server struct {
addr string
ratio float64
counter int64
}
// s2 is a beast and may handle 3 times the requests then s1 *edit
s1 := &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, как счетчик (запросы обрабатываются)
- с2 огромен, так что он имеет 750 в качестве счетчика (запросы обрабатываются)
Это очень простая реализация того, что я получил, но когда я похож на 10000, он продолжает цикл в nextServer() причина N всегда> server.ratio.
до тех пор, пока я около 5000, он отлично работает. но я думаю, что есть лучшие алгоритмы для циклизации в соотношениях.
любая идея, как сделать это простым и надежным?
Это зависит от вашей Desiderata. Значение решения для этой проблемы зависит от того, как вы хотите сбалансировать безопасность и простоту. – 2014-09-24 11:37:04
Я просто хочу зациклиться на истинных вещах. Я могу масштабировать его, когда у меня сплошной цикл –
В простом и относительно безопасном решении серверы будут в списке. Скажем, «r» - это сумма их отношений. 'nextServer()' затем генерирует равномерно случайное действительное число из интервала '[0, r)' и выбирает сервер на основе этого. В вашем случае, если у вас есть список '{s1, s2}', 'nextServer()' будет выбирать 's1', когда он откатывает что-то между' 0' (включительно) и '0.25' (эксклюзивно) и' s2' когда он перемещается между «0,25» и «1». – 2014-09-24 11:42:15