// $1-ді қосу
Golang
Егер өз кодыңызға юнит-тесттер жазсаңыз, қандай тесттер жазар едіңіз? Қандай шеткі жағдайларды тексерер едіңіз?
Идемпотенттілік үшін оқиға идентификаторын қайдан алуға және оны қайда жасауға болады?
Логтарды қайда сақтадыңыз, кодта қандай логтау пакетін қолдандыңыз және логтар stdout-тан Elasticsearch-ке қалай өтті?
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 }
SQL деңгейінде осындай идемпотенттік кілттің бар екенін қалай түсінуге болады? ON CONFLICT-ты қалай пайдалану керек?
Жоба/вакансия туралы айтып беріңіз: технологиялар стекі, команда міндеттері
Кодта басқа қандай жаһандық мәселелер бар? Ақшаны қалай сақтау керек — float қолдануға бола ма?
Транзакция орындалмаса, outbox-те ID-ға не болады?
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 // 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 }
/* Берілген тізім бойынша a, ол өсу ретімен сұрыпталған, индекс элементі index және бүтін k. a[index] мәніне ең жақын k санды кез келген тәртіпте қайтару керек. 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] */
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("Пулды күшпен тоқтату (уақыт шегі: %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("Пулды күшпен тоқтату (уақыт шегі, мүмкін тоқтап қалған горутиналар бар)") } }
sql.DB-ны мән бойынша көшірудің орнына көрсеткіш бойынша көшірудің қандай мәселелері бар?
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 (r *PayoutRepository) Payout(advertiserID, partnerID string, amount float32) error { advertiser, err := r.find(totalPayouts) // транзакцияны қосу 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) // $1 қосу if err != nil { if err == sql.ErrNoRows { return p, errors.New("серіктес табылмады") } return p, err } return p, nil }
Extract the interview question/task from this screenshot. Keep the original language.
Kafka хабарламасында нақты не жазу керек? Тұтынушыларға қандай өрістерді беру керек?
Алгоритм контекстінде ld, rd := 1<<62, 1<<62 дегеніміз не?
storage import ( "database/sql" "errors" "fmt" "time" "github.com/company/my-service/internal/event" "github.com/company/my-service/internal/metric" ) type Partner struct { ID string `db:"id" json:"id"` Balance float32 `db:"balance" json:"balance"` Hold float32 `db:"hold" json:"hold"` } type PayoutRepository struct { db sql.DB eventPublisher event.Publisher metricCollector metric.Collector totalPayouts int } func NewPayoutRepository() *PayoutRepository { db, err := sql.Open("postgres", "host=localhost user=postgres password=postgres dbname=affiliate") if err != nil { panic(err) } r := PayoutRepository{ db: db, eventPublisher: event.NewKafkaPublisher("localhost:9092"), metricCollector: metric.NewPrometheusCollector("localhost:9090"), } go func() { for range time.Tick(time.Minute) { _ = r.metricCollector.Send("TotalPayouts", r.totalPayouts) } }() return r } 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 } func (r *PayoutRepository) find(id string) (Partner, error) { p := Partner{} err := r.db.QueryRow("SELECT * FROM partners WHERE id = " + id).Scan(&p) if err != nil { if err == sql.ErrNoRows { return p, errors.New("partner not found")} } return p, err } 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 }