// pridėti $1
Golang
Jei pats rašytum vienetinius testus savo kodui, kokius rašytum? Kokius kampinius atvejus patikrintum?
Iš kur gauti įvykio ID idempotentiškumui ir kur jį generuoti?
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 }
Kur saugojote žurnalus, kokį žurnalavimo paketą naudojote kode ir kaip žurnalai iš stdout pateko į Elasticsearch?
Kaip SQL lygyje suprasti, kad jau yra tokia idempotencijos raktas? Kaip naudoti ON CONFLICT?
Papaskok apie projektą/darbą: technologijų rinkinys, komandos užduotys
Kas nutiks su ID outbox'e, jei transakcija nebus patvirtinta?
Kokie kiti globalūs problemos yra kode? Kaip saugoti pinigus — ar galima naudoti float?
Koks yra problemos kopijuojant sql.DB reikšme, o ne nuoroda?
Kiek laiko buvo saugomi žurnalai ir kiek laiko buvo saugomi duomenys 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() // Dabar saugu yra uždaryti kanalą close(p.tasks) // signalas darbuotojams: naujų užduočių nebus, skaitykite likusį p.wg.Wait() // laukiame, kol visi gorutinai baigsis p.cancel() // atšaukia kontekstą, jei reikia fmt.Println("Pool sustabdytas.") } // ForceStop priverstinai sustabdo visus darbuotojus be laukimo, kol užduotys bus baigtos. // Darbuotojai bus nedelsiant nutraukti per kontekstą. func (p *Pool) ForceStop(timeout time.Duration) { fmt.Printf("Priverstinis pulo sustabdymas (laiko limitas: %v)...\n", timeout) // Blokuoja naujų užduočių pridėjimą p.mu.Lock() p.isOpen = false p.mu.Unlock() // Uždaro kanalą, kad darbuotojai neimtų naujų užduočių close(p.tasks) // Atšaukia kontekstą – tai nutrauks visas vykdomas užduotis p.cancel() // Suteikia ribotą laiką užbaigimui done := make(chan struct{}) go func() { p.wg.Wait() close(done) }() select { case <-done: fmt.Println("Pool priverstinai sustabdytas (visi darbuotojai baigė)") case <-time.After(timeout): fmt.Println("Pool priverstinai sustabdytas (laiko limitas, gali likti pakabintų goroutine)") } }
func (r *PayoutRepository) Payout(advertiserID, partnerID string, amount float32) error { advertiser, err := r.find(advertiserID) // pridėti sandorį if err != nil { return err } partner, err := r.find(partnerID) if err != nil { return err } advertiser.Balance -= amount // apsaugoti 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 }
Ištraukite pokalbio klausimą/užduotį iš šio ekrano kopijos. Išlaikykite originalią kalbą.
/* Rūšiuotas mažėjimo tvarka sveikųjų skaičių sąrašas a, indeksas index ir sveikasis skaičius k. Reikia grąžinti bet kokia tvarka k skaičių iš sąrašo, kurie yra artimiausi pagal reikšmę elementui 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] arba [5, 7] */
func (r *PayoutRepository) Payout(advertiserID, partnerID string, amount float32) error { advertiser, err := r.find(totalPayouts) // pridėti transakciją jei err != null { grąžinti err } partner, err := r.find(partnerID) jei err != null { grąžinti err } reklamuotojas.Balance -= amount partner.Hold -= amount partner.Balance += amount jei err := r.save(reklamuotojas); err != null { grąžinti err } jei err := r.save(partner); err != null { grąžinti err } r.totalPayouts++ grąžinti null } funkcija (r *PayoutRepository) find(id string) (Partner, error) { p := Partner{} err := r.db.QueryRow("SELECT * FROM partners WHERE id = " + id).Scan(&p) // pridėti $1 jei err != null { jei err == sql.ErrNoRows { grąžinti p, errors.New("partneris nerastas") } grąžinti p, err } grąžinti p, null }
Kas yra ld, rd := 1<<62, 1<<62 algoritmo kontekste?
Ką tiksliai rašyti Kafka žinutėje? Kokius laukus perduoti vartotojams?
Duota surūšiuota mažėjimo tvarka sveikųjų skaičių sąrašas a, elemento indeksas ir sveikasis skaičius k. Reikia grąžinti bet kokia tvarka k skaičių iš sąrašo, kurie yra artimiausi reikšme prie elemento 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] arba [5, 7]