Golang
Čo ste cache-ovali? Nejaké adresáre?
/* Potrebujeme preniesť údaje z určitého zdroja na určitého spotrebiteľa. Pri tom zdroj odovzdáva údaje v malých balíčkoch (~ desiatky záznamov), a spotrebiteľ efektívnejšie pracuje s väčšími dávkami. Reálny príklad - dodávka údajov z frontov typu Kafka do databázy Clickhouse. Zdroj: - Podmienečne nekonečný. - Zdroj nikdy nevracia viac ako MaxItems záznamov v jednom volaní Next. - V rámci jednej "relácie" (jedného volania funkcie Pipe) zdroj vždy vráti nové údaje pri každom volaní Next. - Avšak, po reštarte začne zdroj od predchádzajúcej "potvrdenej" pozície, určené cookie. Preto, *každá* hodnota cookie, ktorú vrátil volanie Next, po uložené údajov v prijímači, musí byť fixovaná volaním Commit, a to prísne v rovnakom poradí, v akom ich vrátil Next. Prijímateľ: - Nemôže spracovať viac ako MaxItems naraz. Základná úroveň: Je potrebné implementovať funkciu func Pipe(p Producer, c Consumer) error ktorá číta údaje zo zdroja, skupinu ich do bufferu veľkosti najviac MaxItems a uloží ich do prijímateľa, a následne fixuje pokrok v zdroji. */ const MaxItems = 9999 type Producer interface { // Next vracia: // - dávku položiek na spracovanie // - cookie na potvrdenie po ukončení spracovania // - chybu Next() (items []any, cookie int, err error) // Commit sa používa na označenie dávky údajov ako spracovanej 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 }
Môžete uviesť spoločnosti alebo dodávateľov, s ktorými ste mali skúsenosti?
Povedaj mi o poslednom mieste práce: čím si sa zaoberal, aký stack si používal, aké boli ťažké úlohy?
Čo je to slice v Go?
Môžete uviesť hlavné typy volaní používaných v gRPC?
Je povolené získavať informácie z kanála s nastaveným uzavretým režimom?
Je možné priamo zapisovať údaje do určitej partície Kafka, obchádzajúc kľúč pre hashovanie?
Môžete vysvetliť mechanizmus pridania prvku na koniec dátovej štruktúry, napríklad zoznamu alebo poľa?
Aké údaje a akým spôsobom sa umiestňujú na zásobník pri spustení programu?
Aké metódy kešovania preferujete používať vo svojich projektoch a prečo?
Aký je rozdiel medzi materializovaným pohľadom a bežným pohľadom?
Aké sú súčasti štruktúry spojeného zoznamu?
Ako sa určuje čas vykonávania operácie pridania prvku podľa kľúča do dátovej štruktúry Map?
Prečo je počiatočná veľkosť zásobníka vlákien zvyčajne nastavená na 2 MB?
Použili ste niekedy štruktúru ErrGroup vo svojich projektoch na správu paralelných úloh?
Aké nezvyčajné alebo nestandardné balíky ste použili vo svojej praxi?
Prečo sa spomaľuje rast plátka a prečo ho nie je možné neustále zdvojnásobovať?
Kde sa počas procesu práce GitLab CI/CD spúšťajú príkazy?
Aké dôsledky môžu nastať pri nedodržiavaní princípov SOLID pri navrhovaní softvéru?