// илова кардан $1
Golang
Агар шумо тестҳои ягона барои коди худ нависед, кадомҳоро менависед? Кадом ҳолатҳои канорӣро санҷед?
Азод кардани ID-и ҳодиса барои идемпотентӣ ва дар куҷо онро тавлид кардан?
Логҳоро дар куҷо нигоҳ медоштед, кадом бастаи логгириро дар код истифода бурдед ва чӣ гуна логҳо аз 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 истифода бурдан?
функция (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 }
Агар транзаксия тасдиқ нашавад, ID дар outbox чӣ мешавад?
/* Тартибланган бўйича камайишга тўғри келадиган тўғри рақамлар рўйхати a, индекс index ва бутун son 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() // περιμένουμε να ολοκληρωθούν όλα τα goroutine p.cancel() // ακυρώνουμε το πλαίσιο, αν χρειάζεται fmt.Println("Pool σταμάτησε.") } // ForceStop αναγκαστικά σταματά όλους τους εργαζόμενους χωρίς να περιμένει την ολοκλήρωση των εργασιών. // Οι εργαζόμενοι θα διακοπούν αμέσως μέσω του πλαισίου. func (p *Pool) ForceStop(timeout time.Duration) { fmt.Printf("Αναγκαστική διακοπή του pool (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("Pool αναγκαστικά σταμάτησε (όλοι οι εργαζόμενοι τερματίστηκαν)") case <-time.After(timeout): fmt.Println("Pool αναγκαστικά σταμάτησε (timeout, ενδέχεται να παραμείνουν goroutines σε αναμονή)") } }
Масъалаи нусхабардории 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) // транзакция қосу егер err != nil { қайтару err } партнер, err := r.find(partnerID) егер err != nil { қайтару err } рекламодател, Бейланс -= сумма партнер.Hold -= сумма партнер.Баланса += сумма егер err := r.save(рекламодател); err != nil { қайтару err } егер err := r.save(партнер); err != nil { қайтару err } r.totalPayouts++ қайтару nil } функция (r *PayoutRepository) find(id string) (Partner, error) { 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 }
Чӣ тавр бояд дар паёми Kafka нависем? Кадом майдонҳоро ба истеъмолкунандагон интиқол диҳем?
Дар бораи ld, rd := 1<<62, 1<<62 дар контексти алгоритм чӣ аст?
пакет за съхранение 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 } 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 }