Sobes.tech

Эгер сен өзүңдүн кодуңузга бирдик тесттер жазсаң, кайсыларыны жазмаксың? Кантип кырый учурларды текшерер элең?

Senior
299

Идempotенттик үчүн окуянын ID-син кайдан алууга болот жана аны кайда түзүү керек?

Senior
199

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 }

Senior
194

SQL деңгээлинде мындай идемпотенттик ачкыч бар экенин кантип түшүнүү керек? ON CONFLICT кандай колдонулат?

Senior
186

Логдорду кай сактадыңыз, коддо кай лог жазуу пакетин колдондуңуз жана логдор stdoutтан Elasticsearchке кантип өттү?

Senior
177

Жобо/вакансия тууралуу айтып бер: технологиялар стеги, команда милдеттери

Senior
167

Коддо кандай башка глобалдык көйгөйлөр бар? Акчаны кантип сактоо керек — float колдонсо болобу?

Senior
156

Амалдат тастыкталбаса, outboxтогу ID менен эмне болот?

Senior
156

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 }

Senior
151

sql.DB'ни ба мааниде көчүрүүнүн көйгөйү эмнеде, көрсөткүч менен эмес?

Senior
138

Логдор канча убакыт сакталды жана Kafkaда маалыматтар канча убакыт сакталды?

Senior
132

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("Пул күч менен токтотулду (тайм-аут, күтүлбөгөн goroutine-дер калат)") } }

Senior
129

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 }

Senior
129

Бул скриншоттон интервью суроолору/тапшырмаларды чыгарыңыз. Түп нуска тилди сактаңыз.

Senior
127

func (r *PayoutRepository) Payout(advertiserID, partnerID string, amount float32) error { advertiser, err := r.find(totalPayouts) // транзакция кошуу эгер err != нөл{ кайтаруу err } партнер, err := r.find(partnerID) эгер err != нөл{ кайтаруу err } рекламодател, Баланса -= сумма партнер.Hold -= сумма партнер.Баланса += сумма эгер err := r.save(рекламодател); err != нөл{ кайтаруу err } эгер err := r.save(партнер); err != нөл{ кайтаруу err } r.totalPayouts++ кайтаруу нөл{ } функция (r *PayoutRepository) find(id string) (Partner, error) { p := Partner{} err := r.db.QueryRow("SELECT * FROM partners WHERE id = " + id).Scan(&p) // $1 кошуу эгер err != нөл{ эгер err == sql.ErrNoRows { кайтаруу p, errors.New("партнер табылган жок") } кайтаруу p, err } кайтаруу p, nil }

Senior
127

/* Тизмектеги бүтүн сандардын тизмеги 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] */

Senior
120

Kafka билдирүүсүндө так эмне жазуу керек? Туура поляларды консьюмерлерге берүү керекпи?

Senior
114

Алгоритмдин контекстинде ld, rd := 1<<62, 1<<62 эмнелер?

Senior
110

пакет сактагыч импорт ( "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 } return p, nil } 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 }

Senior
95
/2