Sobes.tech

Golang

Ce s-a cache-uit? Câteva directoare?

Senior
МВидео/эльдорадо
166

/* 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 }

Middle
Яндекс
166

Puteți enumera companiile sau furnizorii cu care ați avut de-a face?

Junior — Middle
166

Spune-mi despre ultimul loc de muncă: cu ce te ocupai, ce tehnologie foloseai, care au fost sarcinile dificile?

Middle
OZONOZON
166

Ce este un slice în Go?

Middle
Бюро 1440Бюро 1440
166

Puteți enumera principalele tipuri de apeluri utilizate în gRPC?

Junior — Middle
СБЕР дейвайсыСБЕР дейвайсы
166

Este permis să obții informații dintr-un canal cu modul închis activat?

Junior — Middle
ГазпромГазпром
X5 groupX5 group
AvitoAvito
+1
166

Este posibil să scrii direct într-o partiție specifică Kafka, evitând cheia pentru hash?

Junior — Middle
Самокат Тех
166

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?

Junior — Middle
Lamoda Tech
Startribe
Самокат Тех
+2
166

Ce date și în ce mod sunt plasate în stivă în timpul executării programului?

Junior — Middle
166

Ce metode de caching preferați să folosiți în proiectele dvs. și de ce?

Junior — Middle
166

Care este diferența dintre o vedere materializată și o vedere obișnuită?

Middle
RWB
165

Ce componente fac parte din structura unei liste înlănțuite?

Junior — Middle
165

Cum se determină timpul de execuție al operației de adăugare a unui element după cheie în structura de date Map?

Junior — Middle
ЯндексЯндекс
165

De ce se stabilește de obicei dimensiunea inițială a stivei pentru fire la 2 MB?

Junior — Middle
165

Ați folosit vreodată structura ErrGroup în proiectele dvs. pentru gestionarea sarcinilor paralele?

Junior — Middle
165

Ce pachete neobișnuite sau non-standard ați folosit în practica dvs.?

Junior — Middle
165

De ce încetinește creșterea feliei și de ce nu se poate dubla constant?

Middle
RWB
165

Unde se execută comenzile în timpul procesului de lucru GitLab CI/CD?

Junior — Middle
165

Ce consecințe pot apărea în cazul în care nu se respectă principiile SOLID în proiectarea software-ului?

Junior — Middle
Zonatelecom
165
/413