2014-09-24 2 views
1

Я связываюсь в течение нескольких дней, чтобы создать алгоритм, который может обрабатывать истинные вещи, бэкэнд-сервер в моем случае с помощью заданного отношения.Идёт алгоритм для циклических серверов с проксимированием в предопределенном соотношении

, например, я получил 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, он отлично работает. но я думаю, что есть лучшие алгоритмы для циклизации в соотношениях.

любая идея, как сделать это простым и надежным?

+0

Это зависит от вашей Desiderata. Значение решения для этой проблемы зависит от того, как вы хотите сбалансировать безопасность и простоту. – 2014-09-24 11:37:04

+0

Я просто хочу зациклиться на истинных вещах. Я могу масштабировать его, когда у меня сплошной цикл –

+0

В простом и относительно безопасном решении серверы будут в списке. Скажем, «r» - это сумма их отношений. 'nextServer()' затем генерирует равномерно случайное действительное число из интервала '[0, r)' и выбирает сервер на основе этого. В вашем случае, если у вас есть список '{s1, s2}', 'nextServer()' будет выбирать 's1', когда он откатывает что-то между' 0' (включительно) и '0.25' (эксклюзивно) и' s2' когда он перемещается между «0,25» и «1». – 2014-09-24 11:42:15

ответ

3

Что-то вроде этого?

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] 
+0

иногда я пинаю себя в голову и спрашиваю себя, почему я делаю простые вещи так усердно. Это то, с чем я могу работать. thx alot –

+0

Все решения легки, когда вы их видите;) – RickyA

Смежные вопросы