Parle-moi plus en détail du projet chez Avito — était-ce le seul projet en trois ans?
Golang
func (c *Client) Send(ctx context.Context, messages []Message, maxWorkers int) error { sem := make(chan struct{}, maxWorkers) var wg sync.WaitGroup var resultErr error var once sync.Once for _, msg := range messages { wg.Add(1) go func(msg Message) { defer wg.Done() sem <- struct{}{} defer func() { <-sem }() body, err := json.Marshal(msg) if err != nil { once.Do(func() { resultErr = err; cancel() }) return } req, _ := http.NewRequestWithContext( ctx, http.MethodPost, c.url, bytes.NewReader(body), ) req.Header.Set("Content-Type", "application/json") resp, err := c.httpClient.Do(req) if err != nil { once.Do(func() { resultErr = err; cancel()}) return } defer resp.Body.Close() if resp.StatusCode >= 500 { once.Do(func() { resultErr = fmt.Errorf("server error") cancel()}) return } c.sentCount.Add(1) time.Sleep(time.Second) }(msg) } wg.Wait() }
Quel est le type de msg dans la goroutine et pourquoi doit-il être passé en argument?
/* Une tâche a été assignée au développeur pour écrire un service d'envoi de notifications. Exigences: - La méthode Send doit envoyer des messages en parallèle. - Il ne doit pas y avoir plus de maxworkers requêtes HTTP en cours d'exécution simultanément. - Si au moins un envoi échoue, les autres doivent être arrêtés et une erreur doit être renvoyée. - La méthode doit gérer correctement l'annulation du contexte. - Toutes les ressources doivent être libérées correctement. - La méthode peut être appelée de manière concurrente depuis différentes goroutines. - Client doit suivre le nombre de messages envoyés avec succès. Il faut faire une revue de code, trouver les problèmes et corriger le code.
À quel endroit doit-on faire defer resp.Body.Close() ?
Y a-t-il des accords avec d'autres employeurs ou êtes-vous en train de passer des étapes d'entretien?
Pourquoi resultErr n'est-il pas renvoyé directement depuis la goroutine?
Quelle est votre expérience commerciale générale en développement avec Go?
Parle-moi de Touslesoutils — pourquoi es-tu venu et pourquoi es-tu parti?
Sera-t-il confortable de travailler avec la documentation technique en anglais?
Quelle expérience avez-vous avec SQL ? Savez-vous écrire et optimiser des requêtes ?
Où se terminent les contextes dans ce code?
Quelles sont les jeux rapides?
sentCount est transmis sans synchronisation — comment corriger cela?
Que se passe-t-il si on ne transmet pas le contexte dans une requête à la base de données?
Que recherchez-vous dans un nouveau projet ? Quelles technologies vous intéressent ? Qu'aimeriez-vous éviter dans un nouveau lieu de travail ?
Quand l'indice ne sert à rien ou peut même nuire?
Quelles étapes (stages) sont généralement présentes dans un pipeline CI/CD pour un service Go?