Sobes.tech

Golang

Vyvažovač musí pochopit, že backend odpovídá chybami, a při překročení prahu na určitou dobu jej vyloučit z vyvažování (Circuit Breaker)

115

S jakými databázemi a dalšími systémy ukládání dat jste pracoval?

114

V jakém směru byste měl zájem se rozvíjet z hlediska úkolů a kariérního vektoru?

106

Proč zvažujete nové nabídky a proč jste opustil svou předchozí společnost?

104

// kód pro funkci best() // s ošetřením chyb, pokud není dostupný backend

99

// kód pro funkci best() // s ošetřením chyb, pokud není dostupný backend

97

Jak omezit počet gorutin tak, aby současně běželo nejvýše 'threads' metod Process? Kdo bude tahat úkoly z kanálu?

93

// kód pro funkci best() // s ošetřením chyb, pokud není dostupný backend

92

Na kolika hostech nebo instancích služba fungovala? Kolik kontejnerů bylo spuštěno?

88

Kdo čte výsledný kanál a kam následně zapisuje výsledek tak, aby k němu metoda Status mohla přistupovat?

88

// kód pro funkci best() // s ošetřením chyb, pokud není dostupný backend

86

// kód pro funkci best() // s ošetřením chyb, pokud není dostupný backend

80

// kód pro funkci best() // s ošetřením chyb, pokud není dostupný backend

78

Jak implementovat metodu Status pro získání stavu úkolu podle ID?

72

// kód pro funkci best() // s ošetřením chyb, pokud není dostupný backend

65

type Response interface{} type Backend interface { Invoke(ctx context.Context, req Request) (Response, error) } var _ Backend = &BackendImpl{} // addr tartalmazza egy adott példány ip:port címét func NewBackend(addr string) *BackendImpl type backentry struct { backend Backend inflight int64 } type Balancer struct { backends []*backentry mu *sync.Mutex } var _ Backend = &Balancer{} // addrs tartalmazza az összes kiegyensúlyozható példány címét func NewBalancer(addrs []string) *Balancer { data := make([]*backentry,len(addrs)) for i,addr := range addrs{ data[i] = &backentry{ backend: NewBackend(addr), inflight: 0, } } return &Balancer{backends:data} } func(b *Balancer)Invoke(ctx context.Context, req Request) (Response, error){ b.mu.Lock() entry := b.best() atomic.AddInt64(&entry.inflight,1) b.mu.Unlock() defer atomic.AddInt64(&entry.inflight,-1) return entry.backend.Invoke(ctx,req) } func(b *Balancer) best() *backentry{ var best *backentry for _,entry := b.backends{ if best == nil || atomic.LoadInt64(&entry.inflight) < atomic.LoadInt64(&best.inflight){ best = entry } } return best }

64

// kód pro funkci best() // s ošetřením chyb, pokud není dostupný backend

55

// hledání nejlepšího -- ??? // pokud nenajdete, porovnejte inflight

48
/11