// pievienot $1
Golang
Ja tu pats rakstītu vienību testus savam kodam, kurus rakstītu? Kādus stūri gadījumus pārbaudītu?
No kurienes iegūt notikuma ID idempotentībai un kur to ģenerēt?
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 }
Kā SQL līmenī saprast, ka jau ir tāds idempotences atslēga? Kā izmantot ON CONFLICT?
Kur jūs glabājāt žurnālus, kādu žurnālo paketi izmantojāt kodā un kā žurnāli no stdout nonāca līdz Elasticsearch?
Pastāsti par projektu/vakanci: tehnoloģiju steks, komandas uzdevumi
Kas notiks ar ID outbox, ja darījums netiks apstiprināts?
Kādi vēl ir globālie jautājumi kodā? Kā glabāt naudu — vai var izmantot float?
Kāda ir problēma, kopējot sql.DB pēc vērtības, nevis pēc norādītāja?
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 }
Cik ilgi žurnāli tika glabāti un cik ilgi dati tika glabāti Kafka?
func (r *PayoutRepository) Payout(advertiserID, partnerID string, amount float32) error { advertiser, err := r.find(totalPayouts) // pievienot transakciju ja err != null { atgriezt err } partner, err := r.find(partnerID) ja err != null { atgriezt err } reklāmas devējs.Balance -= amount partner.Hold -= amount partner.Balance += amount ja err := r.save(reklāmas devējs); err != null { atgriezt err } ja err := r.save(partner); err != null { atgriezt err } r.totalPayouts++ atgriezt 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 { atgriezt p, errors.New("partneris nav atrasts") } atgriezt p, err } atgriezt p, null }
func (p *Pool) Stop() { p.mu.Unlock() // Tagad ir droši var 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) // pievienot darījumu if err != nil { return err } partner, err := r.find(partnerID) if err != nil { return err } advertiser.Balance -= amount // aizsargāt 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 }
Izņemiet intervijas jautājumu/uzdevumu no šīs ekrānattēla. Saglabājiet oriģinālo valodu.
/* Sakārtots dilstošā secībā veselu skaitļu saraksts a, indekss index un vesels skaitlis k. Jāatgriež jebkādā secībā k skaitļi no saraksta, kas ir vistuvākie pēc vērtības elementam 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] vai [5, 7] */
Kas ir ld, rd := 1<<62, 1<<62 algoritma kontekstā?
Ko tieši rakstīt Kafka ziņojumā? Kādus laukus nodot patērētājiem?
Dotots ir kārts ar nenolaižamu veselu skaitļu sarakstu a, elementa indekss un vesels skaitlis k. Jāatgriež jebkura secība no saraksta, kas ir vistuvāk vērtībai 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] vai [5, 7]