// voeg $1 toe
Golang
Als je zelf unit-tests voor je code zou schrijven, welke zou je schrijven? Welke randgevallen zou je controleren?
Waar het gebeurtenis-ID voor idempotentie vandaan halen en waar het te genereren?
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 }
Hoe op SQL-niveau te begrijpen dat er al zo'n idempotentiesleutel bestaat? Hoe gebruik je ON CONFLICT?
Waar hebt u de logs opgeslagen, welk loggingpakket hebt u in de code gebruikt en hoe kwamen de logs van stdout naar Elasticsearch?
Vertel me over het project/de vacature: technologiestack, taken van het team
Wat gebeurt er met de ID in de outbox als de transactie niet wordt bevestigd?
Welke andere wereldwijde problemen zijn er in de code? Hoe geld opslaan — kan float worden gebruikt?
Wat is het probleem van sql.DB kopiëren op waarde in plaats van per pointer?
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 }
Hoe lang zijn de logs bewaard gebleven en hoe lang zijn de gegevens in Kafka bewaard gebleven?
func (r *PayoutRepository) Payout(advertiserID, partnerID string, amount float32) error { advertiser, err := r.find(totalPayouts) // voeg transactie toe 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) // voeg $1 toe if err != nil { if err == sql.ErrNoRows { return p, errors.New("partner niet gevonden") } return p, err } return p, nil }
func (p *Pool) Stop() { p.mu.Unlock() // Nu kan nu veilig de kanaal sluiten close(p.tasks) // signaal aan de workers: geen nieuwe taken, lees de rest p.wg.Wait() // wachten tot alle goroutines klaar zijn p.cancel() // annuleer de context voor de zekerheid fmt.Println("Pool gestopt.") } // ForceStop forceert het stoppen van alle workers zonder te wachten op het voltooien van taken. // De workers worden onmiddellijk onderbroken via de context. func (p *Pool) ForceStop(timeout time.Duration) { fmt.Printf("Forceren van het stoppen van de pool (timeout: %v)...\n", timeout) // Blokkeer het toevoegen van nieuwe taken p.mu.Lock() p.isOpen = false p.mu.Unlock() // Sluit het kanaal zodat de workers geen nieuwe taken meer nemen close(p.tasks) // Annuleer de context – dit onderbreekt alle lopende taken p.cancel() // Geef een beperkte tijd voor het afronden done := make(chan struct{}) go func() { p.wg.Wait() close(done) }() select { case <-done: fmt.Println("Pool force gestopt (alle workers beëindigd)") case <-time.After(timeout): fmt.Println("Pool force gestopt (timeout, kunnen hangende goroutines blijven)") } }
func (r *PayoutRepository) Payout(advertiserID, partnerID string, amount float32) error { advertiser, err := r.find(advertiserID) // voeg transactie toe if err != nil { return err } partner, err := r.find(partnerID) if err != nil { return err } advertiser.Balance -= amount // bescherm 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 }
Haal de sollicitatievraag/opdracht uit deze screenshot. Houd de oorspronkelijke taal.
/* Een gesorteerde lijst van gehele getallen a, een index index en een geheel getal k. Geef willekeurig k getallen uit de lijst terug die het dichtst bij de waarde van het element a[index] liggen. 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] of [5, 7] */
Wat zijn ld, rd := 1<<62, 1<<62 in de context van het algoritme?
Wat moet er precies in het Kafka-bericht staan? Welke velden moeten aan de consumenten worden doorgegeven?
Er is een gesorteerde niet-aflopende lijst van gehele getallen a, een elementindex index en een geheel getal k. Je moet in willekeurige volgorde k getallen uit de lijst teruggeven die het dichtst bij de waarde van het element a[index] liggen. 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] of [5, 7]