Qu'est-ce que GOMAXPROCS ? Que se passe-t-il si on définit un nombre très élevé ?
Golang
Qu'est-ce que les canaux en Go ? Quels types existent ? Comment sont-ils structurés en interne ?
// Lors de la mise à jour d'une commande, nous devons envoyer les données de la commande à plusieurs services (API tierces) // le nombre de services augmente (peut-être des milliers+) // nous avons écrit le code, au début tout allait bien, mais avec le temps notre service a commencé à consommer beaucoup de mémoire func (s *orderService) SendOrder(ctx context.Context, hosts []string, order Order) { for i := 0; i < len(hosts); i++ { go func() { // Imaginons que c'est un appel réseau long response, err := s.httpClient.Send(ctx, hosts[i], order) if err != nil { s.logger.Error(ctx, "échec de l'envoi", err) return } s.logger.Info(ctx, "succès", response) }() } }
Qu'est-ce que le contexte en Go ? Quelle est la différence entre context.WithTimeout et context.WithDeadline ?
Quelles sont les méthodes de concaténation de chaînes en Go ? Quelle est la différence entre + et strings.Builder ?
Qu'est-ce que le verrouillage pessimiste?
Comment la mise en cache des données a-t-elle été réalisée ? Quelle politique de mise en cache a été utilisée ?
Comment faire en sorte que tous les événements d'une même commande soient dirigés vers une seule partition Kafka?
Que se passera-t-il avec Redis et les clients si Redis est plein et que les politiques d'expulsion sont désactivées?
Qu'est-ce qu'un slice ? Qu'est-ce qui se passe sous le capot d'un slice ? Comment fonctionne la fonction append ?
Qu'est-ce que la Dead Letter Queue (DLQ) ?
// tableau des produits: // ID | cnt_view // ----------- // 1 | 100 // deux utilisateurs ont commencé à regarder le produit avec id = 1 en même temps // et dans notre base de données, 2 transactions parallèles ont été lancées // quel sera le résultat? postgresql func IncrementView(ctx context.Context, db *sql.DB, id int64) error { tx, err := db.BeginTx(ctx, nil) if err != nil { return err } defer tx.Rollback() var cnt int err = tx.QueryRowContext(ctx, "SELECT cnt_view FROM goods WHERE id = $1", id, ).Scan(&cnt) if err != nil { return err } cnt++ _, err = tx.ExecContext(ctx, "UPDATE goods SET cnt_view = $1 WHERE id = $2", cnt, id, ) if err != nil { return err } return tx.Commit() }
Qu'est-ce que Mutex et RWMutex ? Quelle est la différence ?
Comment a-t-on calculé le chiffre de 25 % ? Pourquoi pas 20 ou 30 ?
Comment fonctionne le ramasse-miettes en Go ? Quand est-il lancé ? Peut-on le lancer manuellement ?
func (r *OrderRepository) GetActiveOrderIDs(ctx context.Context, offset, limit int) ([]uint32, error) { var ( res []uint32 args []interface{} ) query := `SELECT id FROM "order" WHERE is_terminated = false LIMIT $1 OFFSET $2;` args = append(args, limit, offset) rows, err := r.slave.Query(ctx, query, args...) if err != nil { return nil, err } for rows.Next() { var orderID uint32 if err = rows.Scan(&orderID); err != nil { return nil, err } res = append(res, orderID) } return res, nil }
Qu'est-ce que les chaînes en Go ? Que représentent-elles sous le capot ?
Quels outils de profilage existent dans Go?
Y a-t-il eu des nuances et des difficultés lors de l'implémentation de Kafka ? S'agissait-il de votre première expérience d'implémentation ?
Qu'est-ce que l'alignement des structures en Go ? Comment optimiser les champs de la structure en mémoire ?