// додај $1
Golang
Ако б си сам писао јединичне тестове за свој код, које би написао? Које би углове тестирао?
Odakle uzeti ID događaja za idempotentnost i gde ga generisati?
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 }
Gde ste čuvali logove, koji paket za logovanje ste koristili u kodu i kako su logovi iz stdout prešli u Elasticsearch?
Kako na nivou SQL shvatiti da već postoji ključ idempotentnosti? Kako koristiti ON CONFLICT?
Ispričaj o projektu/poziciji: tehnološki stack, zadaci tima
Šta će se desiti sa ID u outbox-u ako transakcija ne bude potvrđena?
Koji je problem sa kopiranjem sql.DB po vrednosti, a ne po pokazivaču?
Koji još globalni problemi postoje u kodu? Kako čuvati novac — može li se koristiti float?
Koliko dugo su logovi čuvani i koliko dugo su podaci čuvani u 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() // Сада је безбедно затворити канал close(p.tasks) // сигнал радницима: нема нових задатака, прочитај остатак p.wg.Wait() // чекамо да се све горутинес заврше p.cancel() // отказујемо контекст ако је потребно fmt.Println("Pool заустављен.") } // ForceStop принудно зауставља све раднике без чекања да заврше задатке. // Радници ће бити прекинути одмах преко контекста. func (p *Pool) ForceStop(timeout time.Duration) { fmt.Printf("Принудно заустављање пула (timeout: %v)...\n", timeout) // Блокира додавање нових задатака p.mu.Lock() p.isOpen = false p.mu.Unlock() // Затвара канал да радници не узимају нове задатке close(p.tasks) // Отказујемо контекст – ово ће прекинути све тренутне задатке p.cancel() // Дамо ограничено време за завршетак done := make(chan struct{}) go func() { p.wg.Wait() close(done) }() select { case <-done: fmt.Println("Пул принудно заустављен (сви радници су завршени)") case <-time.After(timeout): fmt.Println("Пул принудно заустављен (таймаут, могу остати виси goroutine-и)") } }
Izvadite pitanje/zadatak sa intervjua sa ovog snimka ekrana. Sačuvajte originalni jezik.
func (r *PayoutRepository) Payout(advertiserID, partnerID string, amount float32) error { advertiser, err := r.find(advertiserID) // dodajte transakciju if err != nil { return err } partner, err := r.find(partnerID) if err != nil { return err } advertiser.Balance -= amount // zaštititi 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 }
/* Sortirana lista celih brojeva a, indeks index i cijeli broj k. Treba vratiti bilo kojim redoslijedom k brojeva iz liste koji su najbliži vrijednosti elementa 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] ili [5, 7] */
функција (r *PayoutRepository) Payout(рекламодавацID, партнерID стринг, износ float32) грешка { рекламодавац, грешка := r.find(totalPayouts) // додај транзакцију ако грешка != nil { врати грешка } партнер, грешка := r.find(partnerID) ако грешка != nil { врати грешка } рекламодавац.Баланса -= износ партнер.Hold -= износ партнер.Баланса += износ ако err := r.save(рекламодавац); err != nil { врати err } ако err := r.save(партнер); err != nil { врати err } r.totalPayouts++ врати nil } функција (r *PayoutRepository) find(id string) (Partner, грешка) { p := Partner{} err := r.db.QueryRow("SELECT * FROM partners WHERE id = " + id).Scan(&p) // додај $1 ако err != nil { ако err == sql.ErrNoRows { врати p, errors.New("партнер не пронађен") } врати p, err } врати p, nil }
Šta su ld, rd := 1<<62, 1<<62 u kontekstu algoritma?
Šta tačno pisati u poruci Kafka? Koja polja prenositi konzumentima?
Dat je sortirani spisak celih brojeva a, indeks elementa index i celobrojni k. Potrebno je da vratite bilo koji redosled k brojeva iz spiska koji su najbliži vrednosti elementa 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] или [5, 7]