Golang
Ce s-a cache-uit? Câteva directoare?
/* Trebuie să transferăm date dintr-o sursă către un consumator. Sursa oferă date în loturi mici (~zeci de înregistrări), în timp ce consumatorul funcționează mai eficient cu loturi mari. Un exemplu real este transferul de date din cozi de tip Kafka în baza de date Clickhouse. Sursa: - Practic infinită. - Sursa nu returnează niciodată mai mult de MaxItems în cadrul unei singure apelări Next. - În cadrul unei "sesiuni" (un apel al funcției Pipe), sursa returnează date noi la fiecare Next. - Cu toate acestea, după repornire, sursa va începe de la poziția "confirmată" anterioară, indicată de cookie. Prin urmare, *fiecare* valoare de cookie returnată de Next, după salvarea datelor în receptor, trebuie confirmată cu o apelare la Commit, în aceeași ordine în care au fost returnate de Next. Receptor: - Nu poate procesa mai mult de MaxItems odată. Nivel de bază: Este necesar să implementați funcția func Pipe(p Producer, c Consumer) error care citește date din sursă, le grupează într-un buffer de dimensiune maximă MaxItems și le salvează în receptor, apoi confirmă progresul în sursă. */ const MaxItems = 9999 type Producer interface { // Next returnează: // - un lot de elemente de procesat // - un cookie pentru a fi confirmat după finalizarea procesării // - o eroare Next() (items []any, cookie int, err error) // Commit este folosit pentru a marca lotul de date ca fiind procesat Commit(cookie int) error } type Consumer interface { Process(items []any) error } func Pipe(p Producer, c Consumer) error { var buf []any var cookies []int for { items, cookie, err := p.Next() if err != nil { return err } buf = append(buf, items...) cookies = append(cookies, cookie) if len(buf) >= MaxItems { if err := c.Process(buf); err != nil { return err } for _, c := range cookies { if err := p.Commit(c); err != nil { return err } } buf = buf[:0] cookies = nil } } if len(buf) > 0 { if err := c.Process(buf); err != nil { return err } for _, c := range cookies { if err := p.Commit(c); err != nil { return err } } } return nil }
Puteți enumera companiile sau furnizorii cu care ați avut de-a face?
Spune-mi despre ultimul loc de muncă: cu ce te ocupai, ce tehnologie foloseai, care au fost sarcinile dificile?
Ce este un slice în Go?
Puteți enumera principalele tipuri de apeluri utilizate în gRPC?
Este permis să obții informații dintr-un canal cu modul închis activat?
Este posibil să scrii direct într-o partiție specifică Kafka, evitând cheia pentru hash?
Poți explica mecanismul de adăugare a unui element la sfârșitul unei structuri de date, cum ar fi o listă sau un array?
Ce date și în ce mod sunt plasate în stivă în timpul executării programului?
Ce metode de caching preferați să folosiți în proiectele dvs. și de ce?
Care este diferența dintre o vedere materializată și o vedere obișnuită?
Ce componente fac parte din structura unei liste înlănțuite?
Cum se determină timpul de execuție al operației de adăugare a unui element după cheie în structura de date Map?
De ce se stabilește de obicei dimensiunea inițială a stivei pentru fire la 2 MB?
Ați folosit vreodată structura ErrGroup în proiectele dvs. pentru gestionarea sarcinilor paralele?
Ce pachete neobișnuite sau non-standard ați folosit în practica dvs.?
De ce încetinește creșterea feliei și de ce nu se poate dubla constant?
Unde se execută comenzile în timpul procesului de lucru GitLab CI/CD?
Ce consecințe pot apărea în cazul în care nu se respectă principiile SOLID în proiectarea software-ului?