// ajouter $1
Golang
Si vous écriviez des tests unitaires pour votre propre code, lesquels écririez-vous ? Quels cas limites vérifieriez-vous ?
D'où obtenir l'ID de l'événement pour l'idempotence et où le générer?
func (r *PayoutRepository) Payout(advertiserID, partnerID string, amount float32) error { advertiser, err := r.find(advertiserID) if err != nil { return err } partner, err := r.find(partnerID) if err != nil { return err } advertiser.Balance -= amount partner.Hold -= amount partner.Balance += amount if err := r.save(advertiser); err != nil { return err } if err := r.save(partner); err != nil { return err } r.totalPayouts++ return nil }
Où avez-vous stocké les logs, quel paquet de journalisation avez-vous utilisé dans le code et comment les logs sont-ils passés de stdout à Elasticsearch?
Comment savoir au niveau SQL qu'une clé d'idempotence existe déjà ? Comment utiliser ON CONFLICT ?
Parlez-moi du projet/offre d'emploi : pile technologique, tâches de l'équipe
Que se passera-t-il avec l'ID dans la boîte d'envoi si la transaction n'est pas validée?
Quel est le problème de copier sql.DB par valeur plutôt que par pointeur?
Quels autres problèmes mondiaux existent dans le code ? Comment stocker de l'argent — peut-on utiliser float ?
Combien de temps les logs ont-ils été conservés et combien de temps les données ont-elles été conservées dans Kafka?
func (r *PayoutRepository) save(p Partner) error { _, err := r.db.Exec( fmt.Sprintf("UPDATE partners SET balance = %s, hold = %s WHERE id = %s", p.Balance, p.Hold, p.ID), ) if err != nil { return err } if err := r.eventPublisher.Publish("BalanceChanged", p); err != nil { return err } return nil }
func (p *Pool) Stop() { p.mu.Unlock() // Maintenant, il est sûr de fermer le canal close(p.tasks) // signal aux workers : pas de nouvelles tâches, lire le reste p.wg.Wait() // attendre que toutes les goroutines se terminent p.cancel() // annuler le contexte au cas où fmt.Println("Pool arrêté.") } // ForceStop arrête de force tous les workers sans attendre la fin des tâches. // Les workers seront interrompus immédiatement via le contexte. func (p *Pool) ForceStop(timeout time.Duration) { fmt.Printf("Arrêt forcé du pool (timeout : %v)...\n", timeout) // Bloquer l'ajout de nouvelles tâches p.mu.Lock() p.isOpen = false p.mu.Unlock() // Fermer le canal pour que les workers ne prennent pas de nouvelles tâches close(p.tasks) // Annuler le contexte – cela interrompra toutes les tâches en cours p.cancel() // Donner un temps limité pour finir done := make(chan struct{}) go func() { p.wg.Wait() close(done) }() select { case <-done: fmt.Println("Pool arrêté de force (tous les workers terminés)") case <-time.After(timeout): fmt.Println("Pool arrêté de force (timeout, des goroutines peuvent rester en suspens)") } }
Extraire la question/devoir d'entretien de cette capture d'écran. Conservez la langue d'origine.
func (r *PayoutRepository) Payout(advertiserID, partnerID string, amount float32) error { advertiser, err := r.find(advertiserID) // ajouter une transaction if err != nil { return err } partner, err := r.find(partnerID) if err != nil { return err } advertiser.Balance -= amount // protéger SELECT FOR UPDATE partner.Hold -= amount partner.Balance += amount if err := r.save(advertiser); err != nil { return err } if err := r.save(partner); err != nil { return err } r.totalPayouts++ return nil }
/* Une liste triée par ordre non décroissant de nombres entiers a, un indice index et un entier k. Il faut retourner dans n'importe quel ordre k nombres de la liste qui sont les plus proches en valeur de l'élément a[index]. a=[2, 3, 5, 7, 11], index=3, k=2 -> [5, 7] a=[4, 12, 15, 15, 24], index=1, k=3 -> [12, 15, 15] a=[2, 3, 5, 7, 11], index=2, k=2 -> [3, 5] ou [5, 7] */
func (r *PayoutRepository) Payout(advertiserID, partnerID string, amount float32) error { advertiser, err := r.find(totalPayouts) // ajouter une transaction if err != nil { return err } partner, err := r.find(partnerID) if err != nil { return err } advertiser.Balance -= amount partner.Hold -= amount partner.Balance += amount if err := r.save(advertiser); err != nil { return err } if err := r.save(partner); err != nil { return err } r.totalPayouts++ return nil } func (r *PayoutRepository) find(id string) (Partner, error) { p := Partner{} err := r.db.QueryRow("SELECT * FROM partners WHERE id = " + id).Scan(&p) // ajouter $1 if err != nil { if err == sql.ErrNoRows { return p, errors.New("partenaire non trouvé") } return p, err } return p, nil }
Qu'est-ce que ld, rd := 1<<62, 1<<62 dans le contexte de l'algorithme?
Que faut-il écrire précisément dans le message Kafka ? Quels champs transmettre aux consommateurs ?
Une liste triée par ordre non décroissant de nombres entiers a, un indice d'élément index et un entier k. Il faut retourner dans n'importe quel ordre k nombres de la liste qui sont les plus proches en valeur de l'élément a[index]. a=[2, 3, 5, 7, 11], index=3, k=2 -> [5, 7] a=[4, 12, 15, 15, 24], index=1, k=3 -> [12, 15, 15] a=[2, 3, 5, 7, 11], index=2, k=2 -> [3, 5] ou [5, 7]