// დაამატე $1
Golang
თუ თქვენ თვითონ დაწერდით ერთეულ ტესტებს თქვენს კოდზე, რომელებს დაწერდით? რა კუთხის შემთხვევებს შეამოწმებდით?
სად მიიღოთ მოვლენის 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 }
სად ინახავდით ლოგებს, რა ლოგირების პაკეტს იყენებდით კოდში და როგორ გადავიდნენ ლოგები stdout-დან Elasticsearch-კენ?
როგორ გავიგოთ SQL დონეზე, რომ უკვე არსებობს ასეთი იდემპოტენციის გასაღები? როგორ გამოვიყენოთ ON CONFLICT?
პროექტის/ვაკანსიის შესახებ ისაუბრე: ტექნოლოგიების სტეკი, გუნდის დავალებები
თუ ტრანზაქცია ვერ დამტკიცდა, რა მოხდება outbox-ში არსებული ID-თან?
რა არის sql.DB-ს მნიშვნელობით კოპირების პრობლემა, არა მითითებით?
კოდში რა სხვა გლობალური პრობლემებია? როგორ შევინახოთ თანხა — შეიძლება გამოიყენოს float?
რამდენი ხანი ინახებოდა ლოგები და რამდენი ხანი ინახებოდა მონაცემები 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-ები)") } }
ამ სკრინშოტიდან ინტერვიუის კითხვა/მოვალეობა გამოიღეთ. ორიგინალური ენა შეინახეთ.
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 (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 -= თანხა პარტნიორი.Бalance += თანხა თუ შეცდომა := r.save(რეკლამა); შეცდომა != null { დაბრუნება შეცდომა } თუ შეცდომა := r.save(პარტნიორი); შეცდომა != null { დაბრუნება შეცდომა } r.totalPayouts++ დაბრუნება null } ფუნქცია (r *PayoutRepository) find(id string) (Partner, შეცდომა) { p := Partner{} შეცდომა := r.db.QueryRow("SELECT * FROM partners WHERE id = " + id).Scan(&p) // $1 დამატება თუ შეცდომა != null { თუ შეცდომა == sql.ErrNoRows { დაბრუნება p, errors.New("პარტნიორი ვერ მოიძებნა") } დაბრუნება p, შეცდომა } დაბრუნება p, null }
რა არის ld, rd := 1<<62, 1<<62 ალგორითმის კონტექსტში?
რა უნდა დავწეროთ Kafka შეტყობინებაში? რა ველები გადავცეთ მომხმარებლებს?
Берілген бүтін сандар тізбегі a, элементтің индексі және бүтін сан 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]