Golang
Pourquoi avez-vous décidé de communiquer avec 2GIS ? Qu'est-ce qui vous a attiré dans l'entreprise ou une offre spécifique?
Avez-vous déjà travaillé avec un accès concurrent aux données dans une base de données? Quels mécanismes comme les transactions et les verrouillages avez-vous utilisés? Existe-t-il des moyens de résoudre ce problème sans impliquer la base de données?
// code pour la fonction best() // avec gestion d'erreurs si aucun backend n'est disponible
Comment avez-vous communiqué les exigences pour déployer un service dans Kubernetes à l'équipe DevOps : sous quel format avez-vous documenté le fonctionnement du service et comment l'interaction a-t-elle été construite?
Quelle est la différence entre les méthodes avec un récepteur par valeur et un récepteur par pointeur en Go, et quand choisir l'un ou l'autre?
// code pour la fonction best() // avec gestion d'erreurs si aucun backend n'est disponible
// code pour la fonction best() // avec gestion d'erreurs si aucun backend n'est disponible
Y a-t-il de la programmation orientée objet en Go ? Si oui, comment est-elle implémentée ; si non, pourquoi ?
Qu'est-ce qui est le plus important pour vous dans le travail?
Que renvoie la lecture d'un canal fermé?
Comment avez-vous organisé la mise à l'échelle et avec quelles architectures de microservices avez-vous travaillé?
Quand une fuite de goroutines se produit-elle?
Comment implémenter la méthode Status pour obtenir l'état de la tâche par ID ?
Que se passe-t-il si une panic survient dans une goroutine séparée?
Comment cela est-il géré dans le code?
type Response interface{} type Backend interface { Invoke(ctx context.Context, req Request) (Response, error) } var _ Backend = &BackendImpl{} // addr contient ip:port d'une instance spécifique func NewBackend(addr string) *BackendImpl type backentry struct { backend Backend inflight int64 } type Balancer struct { backends []*backentry mu *sync.Mutex } var _ Backend = &Balancer{} // addrs contiennent les adresses de toutes les instances équilibrables 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 }
Quelle est la différence entre sync.Mutex et sync.RWMutex?
Décrivez votre processus de développement et de déploiement d'un nouveau service : de la collecte des exigences à la mise en production sur les environnements de développement et de test.
Comment s'est déroulé le déploiement des services?
Implémentez la méthode Queue