Golang
Ի՞նչ է կեշավորվել: Որոշ գրացուցակներ?
/* Մեզ անհրաժեշտ է փոխանցել տվյալներ որոշ աղբյուրից որոշ սպառողի: Աղբյուրը փոքր խմբերով է տալիս տվյալներ (~ տասնյակ գրառումներ), իսկ սպառողը ավելի արդյունավետ է աշխատում մեծ խմբերով: Օրինակ՝ Kafka տիպի հերթերից տվյալների փոխանցումը Clickhouse բազա: Աղբյուր: - Կանխամտածված անսահմանափակ: - Աղբյուրը երբեք չի վերադարձնի ավելի քան MaxItems գրանցամատյան մեկ կանչով Next: - Միևնույն "սեսիայի" շրջանակում (մեկ Pipe ֆունկցիայի կանչում) աղբյուրը յուրաքանչյուր Next-ով նոր տվյալներ է վերադարձնում: - Սակայն, վերագործարկումից հետո աղբյուրը սկսում է նախորդ "հաստատված" դիրքից, որը նշված է cookie-ով: Այդ պատճառով, յուրաքանչյուր cookie արժեք, որը վերադարձվել է Next-ով, պետք է հաստատվի Commit-ով, և դա պետք է կատարվի նույն հերթականությամբ, ինչպես վերադարձվել է: Սպառող: - Չի կարող մշակել ավելի քան MaxItems միանգամից: Հիմնական մակարդակ: Պետք է իրականացնել func Pipe(p Producer, c Consumer) error ֆունկցիան՝ որոնք կկարդա տվյալները աղբյուրից, կկազմեն դրանք բուֆեր, որի չափը չի գերազանցի MaxItems-ը, և կպահեն սպառողում, հետո կստորագրեն առաջընթացը աղբյուրում: */ const MaxItems = 9999 type Producer interface { // Next վերադարձնում է՝ // - խմբաքանակ տվյալների // - cookie հաստատելու համար // - սխալ Next() (items []any, cookie int, err error) // Commit-ը նշում է, որ տվյալ խմբաքանակը մշակված է 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 }
Կարող եք նշել ընկերություններ կամ մատակարարներ, որոնց հետ գործ եք ունեցել?
Խոսեք ձեր վերջին աշխատանքային վայրի մասին: ինչ եք անում, ինչ տեխնոլոգիաներ եք օգտագործում, ինչ դժվար խնդիրներ ունեք?
Ի՞նչ է slice-ը Go-ում։
Կարող եք նշել gRPC-ում օգտագործվող հիմնական զանգերի տեսակները?
Արդյոք թույլատրելի է փակ ռեժիմով կարգավորված ալիքից տեղեկություններ ստանալը?
Կարո՞ղ է ուղիղ գրանցել Kafka-ի որոշակի բաժնում, շրջանցելով հեշավորման համար բանալի։
Կարող եք բացատրել տվյալների կառուցվածքի, օրինակ, ցանկի կամ զանգվածի վերջում տարր ավելացնելու մեխանիզմը?
Ի՞նչ տվյալներ և ինչպե՞ս են տեղադրվում ստեկում ծրագրի կատարման ժամանակ։
Ի՞նչ մեթոդներ եք նախընտրում օգտագործել ձեր նախագծերում և ինչու՞:
Ի՞նչն է տարբերությունը մատակարարված տեսքի և սովորական տեսքի միջև։
Ի՞նչ բաղադրիչներ են մտնում կապակցված ցանկի կառուցվածքին։
Ինչպե՞ս է որոշվում Map տվյալների կառուցվածքում բանալիով տարր ավելացնելու գործողության կատարման ժամանակը։
Ինչու է սովորաբար թելերի սկզբնական ստեկի չափը սահմանվում է 2 ՄԲ-ով?
Կարո՞ղ եք երբևէ օգտագործել ErrGroup կառուցվածքը ձեր նախագծերում՝ հոսքային առաջադրանքները կառավարելու համար։
Ի՞նչ անսովոր կամ ոչ ստանդարտ փաթեթներ եք օգտագործել ձեր պրակտիկայում:
Ինչու է սլայսի աճը դանդաղում և ինչու չի կարելի մշտապես կրկնապատկել?
Որտե՞ղ է կատարվում հրահանգների գործարկումը GitLab CI/CD-ի աշխատանքային գործընթացում։
Ի՞նչ հետևանքներ կարող են առաջանալ ծրագրային ապահովման նախագծման ժամանակ SOLID սկզբունքների պահպանման բացակայության դեպքում։