Golang
Ko kešējāt? Kādas direktorijas?
/* Mums nepieciešams pārsūtīt datus no noteikta avota noteiktam patērētājam. Šajā procesā avots sniedz datus mazās partijās (~ desmitiem ierakstu), bet patērētājs efektīvāk strādā ar lielākiem batčiem. Reāls piemērs - datu piegāde no Kafka tipa rindām uz Clickhouse datubāzi. Avots: - Nosacīti bezgalīgs. - Avots nekad neatgriezīs vairāk par MaxItems ierakstiem vienā Next izsaukumā. - Vienā "sesijā" (viena Pipe funkcijas izsaukuma laikā) avots katru reizi atgriež jaunus datus. - Tomēr, pēc pārstartēšanas, avots sāk no iepriekšējās "apstiprinātās" pozīcijas, kas norādīta ar cookie. Tādēļ, *katra* cookie vērtība, ko atgrieza Next, pēc datu saglabāšanas saņēmējā, jāapstiprina ar Commit, un tas jāizdara stingri tādā pašā secībā, kā tie tika atgriezti. Saņēmējs: - Nevar apstrādāt vairāk par MaxItems vienlaikus. Pamatlīmenis: Jāimplementē funkcija func Pipe(p Producer, c Consumer) error, kura lasa datus no avota, tos grupē buferī, kura lielums nepārsniedz MaxItems, un saglabā saņēmējā, pēc tam apstiprina progresu avotā. */ const MaxItems = 9999 type Producer interface { // Next atgriež: // - datu partiju // - cookie apstiprināšanai // - kļūdu Next() (items []any, cookie int, err error) // Commit apzīmē, ka datu partija ir apstrādāta 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 }
Vai jūs varat uzskaitīt uzņēmumus vai piegādātājus, ar kuriem sadarbojāt?
Pastāsti par savu pēdējo darba vietu: ar ko nodarbojies, kādu tehnoloģiju steku izmantoji, kādas bija grūtās uzdevumi?
Kas ir slice Go valodā?
Vai jūs varētu uzskaitīt galvenos gRPC izmantotos zvanu tipus?
Vai ir atļauts iegūt informāciju no kanāla ar iestatītu slēgto režīmu?
Vai ir iespējams tieši rakstīt noteiktā Kafka daļā, neizmantojot atslēgu hashēšanai?
Vai jūs varat izskaidrot mehānismu, kā elementu pievieno datu struktūras, piemēram, saraksta vai masīva, beigās?
Kādi dati un kādā veidā tiek izvietoti stekā programmas izpildes laikā?
Kādus kešēšanas metodes jūs visbiežāk izmantojat savos projektos un kāpēc?
Kā atšķiras materializēts skats no parasta skata?
Kādi komponenti veido saistītā saraksta struktūru?
Kā tiek noteikts laiks, kas nepieciešams, lai veiktu elementa pievienošanas operāciju pēc atslēgas Map datu struktūrā?
Kāpēc parasti pavedienu sākuma steka lielums ir iestatīts uz 2 MB?
Vai kādreiz esat izmantojis ErrGroup struktūru savos projektos paralēlo uzdevumu pārvaldībai?
Kādus neparastus vai nestandartus paketus esat izmantojis savā praksē?
Kāpēc šķēles pieaugums palēninās un kāpēc to nevar pastāvīgi dubultot?
Kur tiek izpildīti komandas GitLab CI/CD darba procesā?
Kādas sekas var rasties, ja programmatūras projektēšanā netiek ievēroti SOLID principi?