// кошуу $1
Golang
Эгер сен өзүңдүн кодуңузга бирдик тесттер жазсаң, кайсыларыны жазмаксың? Кантип кырый учурларды текшерер элең?
Идempotенттик үчүн окуянын 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 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 кандай колдонулат?
Логдорду кай сактадыңыз, коддо кай лог жазуу пакетин колдондуңуз жана логдор stdoutтан Elasticsearchке кантип өттү?
Жобо/вакансия тууралуу айтып бер: технологиялар стеги, команда милдеттери
Коддо кандай башка глобалдык көйгөйлөр бар? Акчаны кантип сактоо керек — 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 }
sql.DB'ни ба мааниде көчүрүүнүн көйгөйү эмнеде, көрсөткүч менен эмес?
Логдор канча убакыт сакталды жана Kafkaда маалыматтар канча убакыт сакталды?
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-дер калат)") } }
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) // транзакция кошуу эгер 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 }
/* Тизмектеги бүтүн сандардын тизмеги 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] */
Kafka билдирүүсүндө так эмне жазуу керек? Туура поляларды консьюмерлерге берүү керекпи?
Алгоритмдин контекстинде ld, rd := 1<<62, 1<<62 эмнелер?
пакет сактагыч импорт ( "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 }