// ekle $1
Golang
Kendi kodun için birim testleri yazacak olsan, hangilerini yazardın? Hangi köşe durumlarını kontrol ederdin?
İdempotanslık için olay kimliğini nereden almalı ve nerede oluşturmalı?
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 }
Logları nerede sakladınız, kodda hangi loglama paketini kullandınız ve loglar stdout'tan Elasticsearch'e nasıl geçti?
SQL seviyesinde zaten bir idempotans anahtarının olup olmadığını nasıl anlayabiliriz? ON CONFLICT nasıl kullanılır?
Proje/hizmet hakkında bilgi verin: teknolojik yığın, ekip görevleri
İşlem onaylanmazsa, outbox'taki ID ile ne olur?
Koddaki diğer küresel sorunlar nelerdir? Parayı nasıl saklamalı — float kullanılabilir mi?
sql.DB'yi değer olarak kopyalamanın yerine göstergeyle kopyalamanın sorunu nedir?
Kayıtlar ne kadar süre saklandı ve Kafka'da veriler ne kadar süre saklandı?
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() // Artık kanalı güvenle kapatabiliriz close(p.tasks) // işçilere sinyal: yeni görev yok, kalanını okuyun p.wg.Wait() // tüm goroutine'lerin tamamlanmasını bekle p.cancel() // gerekirse bağlamı iptal et fmt.Println("Havuz durduruldu.") } // ForceStop, tüm işçileri görevlerin tamamlanmasını beklemeden zorla durdurur. // İşçiler, bağlam aracılığıyla hemen kesilecektir. func (p *Pool) ForceStop(timeout time.Duration) { fmt.Printf("Havuzu zorla durdurma (zaman aşımı: %v)...\n", timeout) // Yeni görev eklemeyi engelle p.mu.Lock() p.isOpen = false p.mu.Unlock() // Kanalı kapat, böylece işçiler yeni görev almayacak close(p.tasks) // Bağlamı iptal et – bu, tüm çalışan görevleri durduracaktır p.cancel() // Sınırlı süre ver, tamamlaması için done := make(chan struct{}) go func() { p.wg.Wait() close(done) }() select { case <-done: fmt.Println("Havuz zorla durduruldu (tüm işçiler tamamlandı)") case <-time.After(timeout): fmt.Println("Havuz zorla durduruldu (zaman aşımı, takılı kalan goroutines olabilir)") } }
func (r *PayoutRepository) Payout(advertiserID, partnerID string, amount float32) error { advertiser, err := r.find(advertiserID) // işlem ekle if err != nil { return err } partner, err := r.find(partnerID) if err != nil { return err } advertiser.Balance -= amount // SELECT FOR UPDATE koruma 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 }
Bu ekran görüntüsünden mülakat sorusu/görevi çıkarın. Orijinal dili koruyun.
/* Sıralanmış artan sırayla dizili tam sayılar a, bir indeks index ve bir tam sayı k verilir. Diziden, a[index] öğesine en yakın olan k sayıyı herhangi bir sırayla geri döndürmeniz gerekir. 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] veya [5, 7] */
func (r *PayoutRepository) Payout(advertiserID, partnerID string, amount float32) error { advertiser, err := r.find(totalPayouts) // bir işlem ekle 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 ekle if err != nil { if err == sql.ErrNoRows { return p, errors.New("ortak bulunamadı") } return p, err } return p, nil }
Algoritma bağlamında ld, rd := 1<<62, 1<<62 nedir?
Kafka mesajında tam olarak ne yazılmalı? Tüketicilere hangi alanlar iletilmeli?
Bir artış sırasına göre sıralanmış tamsayılar listesi a, bir öğe indeksi index ve bir tamsayı k verilir. Liste içinden, a[index] öğesine en yakın olan k sayıyı herhangi bir sırayla geri döndürmeniz gerekir. 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] veya [5, 7]