Golang
Co bylo cachováno? Nějaké adresáře?
/* Potřebujeme přenést data z nějakého zdroje k nějakému příjemci. Zdroj dodává data v malých dávkách (~desítky záznamů), zatímco příjemce pracuje efektivněji s většími dávkami. Reálný příklad je přenos dat z front typu Kafka do databáze Clickhouse. Zdroj: - Téměř nekonečný. - Zdroj nikdy nevrátí více než MaxItems záznamů v jednom volání Next. - V rámci jedné "seance" (jedno volání funkce Pipe) zdroj při každém Next vrací nová data. - Po restartu však zdroj začne od předchozí "potvrzené" pozice, kterou určuje cookie. Proto musí být každá hodnota cookie, kterou Next vrátí, po uložení dat do příjemce potvrzena voláním Commit, a to ve stejném pořadí, v jakém byla vrácena. Příjemce: - Nedokáže zpracovat více než MaxItems najednou. Základní úroveň: Je třeba implementovat funkci func Pipe(p Producer, c Consumer) error, která čte data ze zdroje, seskupuje je do bufferu o velikosti nejvýše MaxItems a ukládá je do příjemce, později potvrzuje pokrok ve zdroji. */ const MaxItems = 9999 type Producer interface { // Next vrací: // - dávku položek k zpracování // - cookie k potvrzení po dokončení zpracování // - chybu Next() (items []any, cookie int, err error) // Commit slouží k označení dávky dat jako zpracované 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 uvést společnosti nebo dodavatele, se kterými jste měli zkušenosti?
Pověz mi o posledním místě práce: čím ses zabýval, jaký stack jsi používal, jaké byly složité úkoly?
Co je to slice v Go?
Můžete vyjmenovat hlavní typy volání používané v gRPC?
Je povoleno získávat informace z kanálu s nastaveným uzavřeným režimem?
Lze přímo zapisovat data do určité partitiony Kafka, obcházejíc klíč pro hashování?
Můžete vysvětlit mechanismus přidání prvku na konec datové struktury, například seznamu nebo pole?
Jaká data a jakým způsobem jsou umístěna na zásobníku při spuštění programu?
Jaké metody cachování preferujete používat ve svých projektech a proč?
Čím se liší materializovaný pohled od běžného pohledu?
Jaké komponenty tvoří strukturu spojového seznamu?
Jak je určena doba provádění operace přidání prvku podle klíče do datové struktury Map?
Proč je obvykle počáteční velikost zásobníku vláken nastavena na 2 MB?
Použili jste někdy ve svých projektech strukturu ErrGroup pro správu paralelních úkolů?
Jaké neobvyklé nebo nestandardní balíčky jste ve své praxi použili?
Proč se zpomaluje růst plátku a proč ho nelze neustále zdvojnásobovat?
Kde se během procesu práce GitLab CI/CD spouštějí příkazy?
Jaké důsledky mohou nastat při nedodržování principů SOLID při navrhování softwaru?