Golang
Nə cache-lənmişdi? Hər hansı bir qovluqlar?
/* Biz manbadan ma'lumotlarni iste'molchiga uzatishimiz kerak. Manba kichik partiyalar (~o'n yozuv) bilan ma'lumotlarni taqdim etadi, iste'molch esa katta partiyalar bilan samaraliroq ishlaydi. Haqiqiy misol - Kafka turidagi navbatlardan Clickhouse bazasiga ma'lumot uzatish. Manba: - deyarli cheksiz. - Manba har doim Next chaqiruvida MaxItems dan ko'p yozuvlarni qaytarmaydi. - Bir "sessiya" (bir Pipe funksiyasi chaqiruvi) davomida, manba har Next chaqiruvida yangi ma'lumotlarni qaytaradi. - Biroq, qayta ishga tushirilgandan so'ng, manba avvalgi "tasdiqlangan" pozitsiyadan, cookie bilan belgilangan joydan boshlanadi. Shuning uchun, har bir cookie qiymati, Next qaytarib bergandan so'ng, ma'lumotlar qabul qiluvchiga saqlangandan keyin, Commit chaqiruvi bilan tasdiqlanishi kerak, va ular Next tomonidan qaytarilgan tartibda bo'lishi shart. Qabul qiluvchi: - Bir vaqtning o'zida MaxItems'tan ko'p ishlov berolmaydi. Asosiy daraja: Kerak bo'lsa, func Pipe(p Producer, c Consumer) error funksiyasini amalga oshiring, bu funktsiya manbadan ma'lumotlarni o'qiydi, ularni MaxItems o'lchamdagi bufferga guruhlaydi va qabul qiluvchiga saqlaydi, so'ngra manbada progressni tasdiqlaydi. */ const MaxItems = 9999 type Producer interface { // Next,: // - ishlov beriladigan elementlar paketlari qaytaradi // - tasdiqlash uchun cookie // - xato Next() (items []any, cookie int, err error) // Commit, ma'lumotlar partiyasini ishlov berilgan deb belgilash uchun ishlatiladi 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 }
Əlaqə saxladığınız şirkətləri və ya tədarükçüləri sadalaya bilərsinizmi?
Son iş yeriniz haqqında danışın: nə ilə məşğul olurdunuz, hansı texnologiyaları istifadə edirdiniz, çətin tapşırıqlar nə idi?
Go-da dilim nədir?
gRPC-də istifadə olunan əsas çağrı növlərini sadalaya bilərsinizmi?
Bağlı rejim aktivləşdirilmiş kanaldan məlumat almaq mümkündürmü?
Kafka-da müəyyən bir partisyaya birbaşa məlumat yazmaq mümkündürmü, hash üçün açar keçmədən?
Məlumatlar strukturunun, məsələn, siyahı və ya massiv kimi, sonuna element əlavə etmə mexanizmini izah edə bilərsinizmi?
Proqram icra edilərkən yığımda hansı məlumatlar və necə yerləşdirilir?
Layihələrinizdə hansı keşik metodlarından istifadə etməyi üstün tutursunuz və niyə?
Materialized view ilə adi view arasındakı fərq nədir?
Əlaqəli siyahının quruluşuna hansı komponentlər daxildir?
Map verilənlər struktüründə açar ilə element əlavə etmə əməliyyatının icra vaxtı necə müəyyən edilir?
Niyə ümumiyyətlə iş parçaları üçün başlanğıc yığını ölçüsü 2 MB olaraq təyin edilir?
Layihələrinizdə paralel tapşırıqları idarə etmək üçün ErrGroup strukturundan istifadə etdinizmi?
Tətbiqinizdə hansı qeyri-adi və ya standart olmayan paketlərdən istifadə etmisiniz?
Niyə dilimin artımı yavaşlayır və niyə davamlı olaraq iki dəfə artıra bilmirik?
GitLab CI/CD iş prosesində əmrlər harada icra olunur?
Proqram təminatı dizaynında SOLID prinsiplərinə riayət edilməməsinin nəticələri nə ola bilər?