// lisa $1
Golang
Kui sa kirjutaksid iseüksustestid oma koodile, milliseid kirjutaksid? Milliseid nurgaolukordi kontrolliksid?
Kust saada sündmuse ID idempotentsuse jaoks ja kus seda genereerida?
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 }
Kus te säilitas logisid, millist logimise paketti kasutasite koodis ja kuidas logid stdoutist Elasticsearchi jõudsid?
Kuidas SQL tasandil mõista, et selline idempotentsusvõti juba eksisteerib? Kuidas kasutada ON CONFLICT?
Räägi projektist/tööpakkumisest: tehnoloogiate stekk, meeskonna ülesanded
Mis juhtub ID-ga outboxis, kui tehing ei kinnitata?
Millised teised globaalsed probleemid on koodis? Kuidas raha hoida — kas floati saab kasutada?
Mis on probleem sql.DB kopeerimisel väärtuse järgi, mitte näidise järgi?
Kui kaua logisid hoiti ja kui kaua andmeid Kafka's hoiti?
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() // Tagad ir droši aizvērt kanālu close(p.tasks) // signāls darbiniekiem: jaunu uzdevumu nebūs, lasiet pārējo p.wg.Wait() // gaidām, līdz visas goroutines pabeigsies p.cancel() // gadījumā atceļam kontekstu fmt.Println("Pool apturēts.") } // ForceStop piespiedu kārtā aptur visus darbiniekus, nesagaidot uzdevumu pabeigšanu. // Darbinieki tiks nekavējoties pārtraukti caur kontekstu. func (p *Pool) ForceStop(timeout time.Duration) { fmt.Printf("Piesaistes apturēšana (laika limits: %v)...\n", timeout) // Bloķē jaunu uzdevumu pievienošanu p.mu.Lock() p.isOpen = false p.mu.Unlock() // Aizver kanālu, lai darbinieki neņemtu jaunus uzdevumus close(p.tasks) // Atceļ kontekstu – tas pārtrauks visus pašreizējos uzdevumus p.cancel() // Dod ierobežotu laiku pabeigšanai done := make(chan struct{}) go func() { p.wg.Wait() close(done) }() select { case <-done: fmt.Println("Pool piespiedu kārtā apturēts (visi darbinieki pabeiguši)") case <-time.After(timeout): fmt.Println("Pool piespiedu kārtā apturēts (laika limits, var palikt pakarēju goroutine)") } }
func (r *PayoutRepository) Payout(advertiserID, partnerID string, amount float32) error { advertiser, err := r.find(advertiserID) // lisada tehing if err != nil { return err } partner, err := r.find(partnerID) if err != nil { return err } advertiser.Balance -= amount // kaitsta 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 }
Tõmmake välja intervjuu küsimus/ülesanne sellest ekraanipildist. Säilitage algkeel.
/* Järjestatud mitte-kasvavas järjekorras täisarvude nimekiri a, indeks index ja täisarv k. Peate tagastama mis tahes järjekorras k arvu nimekirjast, mis on kõige lähemal väärtuselt elemendile 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] või [5, 7] */
func (r *PayoutRepository) Payout(advertiserID, partnerID string, amount float32) error { advertiser, err := r.find(totalPayouts) // transaktsiooni lisamine kui err != null { tagasta err } partner, err := r.find(partnerID) kui err != null { tagasta err } reklāmdevējs.Balance -= amount partner.Hold -= amount partner.Balance += amount ja err := r.save(reklāmdevējs); err != null { tagasta err } ja err := r.save(partner); err != null { tagasta err } r.totalPayouts++ return null } funkcija (r *PayoutRepository) find(id string) (Partner, error) { p := Partner{} err := r.db.QueryRow("SELECT * FROM partners WHERE id = " + id).Scan(&p) // pievienot $1 ja err != null { ja err == sql.ErrNoRows { return p, errors.New("partneris nav atrasts") } return p, err } return p, null }
Mis on ld, rd := 1<<62, 1<<62 algoritmi kontekstis?
Mida täpselt kirjutada Kafka sõnumisse? Milliseid välju edastada tarbijatele?
Antud on järjestatud mitte-vähenevasse järjekorda täisarvude nimekiri a, elemendi indeks ja täisarv k. Võite tagastada mis tahes järjekorras k arvu nimekirjast, mis on kõige lähemal väärtuselt elemendile 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] või [5, 7]