Golang
Эмне кэштелди? Кайсыдыр каталогторбу?
/* Бізге деректерді белгілі бір көзден белгілі бір тұтынушыға беру керек. Бұл кезде көз шағын топтамалармен береді (~ он шақты жазбалар), ал тұтынушы үлкен батчтармен тиімді жұмыс істейді. Шынайы мысал - Kafka тәрізді кезектерден деректерді Clickhouse базасына жеткізу. Көз: - Шартты түрде шексіз. - Көз бір шақыруда MaxItems-ден көп жазбаны қайтармайды. - Бір "сессия" (бір Pipe функциясының шақыруы) ішінде көз әр шақыруда жаңа деректер қайтарады. - Алайда, қайта іске қосқаннан кейін көз алдыңғы "расталған" позициядан бастайды, ол 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 }
Түз менен иштешкен компаниялар же жеткирүүчүлөрдү тизмектей аласызбы?
Акыркы иш оруучу жайыңыз тууралуу айтып бериңиз: эмне менен алектендиңиз, кайсы стекти колдондуңуз, кыйынчылык жараткан тапшырмалар кандай болду?
Go тилинде slice деген эмне?
gRPCте колдонулган негизги чакыруунун түрлөрүн тизмелеп бере аласызбы?
Жабык режим орнотулган каналдан маалымат алуу уруксатпы?
Kafkaда белгилүү бир бөлүмгө түздөн-түз жазуу мүмкүнбү, хештөө үчүн ачкычты өткөрүп жиберүү менен?
Маалыматтар түзүмүнүн, мисалы, тизмек же массивдин акырында элемент кошуу механизмин түшүндүрө аласызбы?
Программа ишке ашырылганда стекке кандай маалыматтар жана кандайча жайгаштырылат?
Жобаларыңызда кайсы кэштоо ыкмаларын колдонуп жатасыз жана эмнеге?
Материалдаштырылган көрүнүш менен жөнөкөй көрүнүштүн айырмасы эмнеде?
Байланыштуу тизмектин түзүлүшүнө кайсы компоненттер кирет?
Map маалыматтар түзүмүндө ачкыч боюнча элемент кошуу операциясынын аткаруу убактысы кандай аныкталат?
Неге көбінесе жіптердің бастапқы стек өлшемі 2 МБ-ға орнатылады?
Эргруп структурасын долбоорлоруңузда параллель тапшырмаларды башкаруу үчүн колдондуңузбу?
Практикаңызда кандайча сирек кездешкен же стандартка кирбеген пакеттерди колдондуңуз?
Неге бөлүктүн өсүшү жайлайт жана эмне үчүн аны дайыма эки эсеге көбөйтүү мүмкүн эмес?
GitLab CI/CD иш процесинде буйруктардын ишке ашырылышы кайда болот?
Программалык камсыздоону долбоорлоодо SOLID принциптерин сактабоо менен кандай кесепеттер болушу мүмкүн?