Sobes.tech

Golang

Ar šiuo metu gyvenate Maskvoje? Kokią miestą svarstote? Ar svarstote hibridinį darbo formatą? Kokiame paieškos etape esate?

223

Ar turite kitus aktyvius pokalbių procesus?

222

Ar galite nurodyti savo dabartinį pajamų lygį?

Junior — Middle
221

Kaip šios metrikos yra integruojamos ir rodomos Grafanoje?

Junior — Middle
221

Masteliojančios žinučių siuntimo sistemos projektavimas, kuri palaiko 150 milijonų naudotojų, 75 milijonų DAU, 225 milijonų MAU, 1,2 milijono skaitymų / 300 tūkst. rašymų QPS, 5 milijonus vienu metu veikiančių naudotojų, 60 PB naujų duomenų per metus, 30% metinis augimas, P99 <200 ms skaitymui, <300 ms rašymui, SLA 99,95%. KONTEKSTAS Reikia sukurti paskirstytą žinučių siuntimo sistemą, panašią į WhatsApp, kuri palaiko 1:1 ir grupinius pokalbius, užtikrina žinučių pristatymą, rodo naudotojų būsenas internete ir perduoda multimedijos failus (nuotraukas, vaizdo įrašus, garsus). Sistema turi užtikrinti aukštą prieinamumą ir žemą delsą, palaikyti didelį paralelizmą ir būti skalaujama pasauliniu lygiu. FUNKCINIAI REIKALAVIMAI - Palaikymas asmeninių (1:1) ir grupinių pokalbių su galimybe pridėti/pašalinti dalyvius - Tekstinių žinučių ir multimedijos failų siuntimas ir gavimas NEFUNKCINIAI REIKALAVIMAI - Nėra aiškios end-to-end šifravimo įgyvendinimo paslaugų ar klientų lygyje, išskyrus bendrą pastabą. - Aiškus duomenų bazės sharding ir replikacijos aprašymas pagal chat_id ar user_id nėra pateiktas, siekiant užtikrinti skalavimą ir atsparumą gedimams. - Nėra aiškios komponento ar mechanizmo offline žinučių sinchronizacijai ir pristatymo patvirtinimams. - Neaišku, kaip vyksta apkrovos paskirstymas tarp duomenų bazių ir paslaugų, ypač piko metu. **Svarbūs aspektai, kuriuos reikia apsvarstyti:** (Diagrama rodo architektūrą su Load Balancer, API Gateway, Message Queue, Service, Cache, Database, Object Storage ir CDN)

220

Kokį operacijų skaičiaus rodiklį per sekundę skaitant duomenis pasiekėte arba analizavote?

Middle — Middle+
220

Kokia buvo paskutinį kartą dirbus komandos sudėtis?

Junior — Middle
219

Ar turi savo aktyvų GitHub ar LinkedIn?

218

Trumpai papasakok, kuo užsiėmėte ankstesnėse darbo vietose ir kokias funkcijas įgyvendinote.

214

/* Mums reikia perduoti duomenis iš tam tikro šaltinio tam tikram vartotojui. Šaltinis teikia mažas duomenų dalis (~ dešimtys įrašų), o vartotojas efektyviau dirba su dideliais paketais (~ tūkstančiai įrašų). Tikras pavyzdys - duomenų perdavimas iš Kafka tipo eilės į Clickhouse bazę. Šaltinis: - Sąlyginai begalinis. - Šaltinis niekada negrąžina daugiau nei MaxItems įrašų vienu Next iškvietimu. - Vienoje "sesijoje" (vieno Pipe funkcijos iškvietimo metu) šaltinis kiekvieną kartą grąžina naujus duomenis. - Tačiau, perkrovus, šaltinis pradės nuo ankstesnės "patvirtintos" pozicijos, nurodytos cookie. Todėl kiekviena reikšmė, kurią grąžino Next iškvietimas, po duomenų išsaugojimo priėmėjui, turi būti patvirtinta Commit iškvietimu, ir tai turi būti padaryta tik ta pačia seka, kuria grąžino Next. Priėmėjas: - Negali apdoroti daugiau nei MaxItems vienu metu. Pagrindinis lygis: Reikia įgyvendinti funkciją func Pipe(p Producer, c Consumer) error, kuri skaito duomenis iš šaltinio, juos grupuoja į buferį, kurio dydis ne didesnis kaip MaxItems, ir saugo juos priėmėjui, po to atnaujina progresą šaltinyje. Sudėtingumas: Next, Process ir Commit metodai yra susiję su tinklo iškvietimais ir gali veikti gana ilgai. Siekiant pagreitinti duomenų perdavimą, reikia paralelinti skaitymo, įrašymo ir patvirtinimo procesus. Taip, kad Process arba Commit iškvietimo metu, skaitymas iš šaltinio ir naujo buferio formavimas tęstųsi. */

213

Kaip yra suorganizuoti testai komandoje — kas ką rašo, kokia apimtis, ar yra E2E?

212

Kaip galima padidinti elementų paieškos efektyvumą Map duomenų struktūroje?

Junior — Middle
211

/* PostgreSQL-ų du serveriai: * PROD - OLTP serveris, * STATS - serveris ilgalaikėms analitinėms užklausoms. Dabartiniame serveryje, prod duomenų bazėje, yra didelė (10Tb) lentelė su šia struktūra: CREATE TABLE profiles( id SERIAL, data JSONB ) Lentelėje gali būti "skylės", t.y. kai kurie `id` gali būti praleisti. Reikia parašyti programą, kuri kopijuoja lentelę profiles iš PROD į STATS. Numatoma, kad bus naudojami šie sąsajos elementai darbui su duomenų bazėmis: type Row []interface{} type Database interface { // įgyvendinimas gali atnaujinti ryšius // SaveRows iškvietimas yra idempotentinis io.Closer GetMaxID(ctx context.Context) (uint64, error) LoadRows(ctx context.Context, minID, maxID uint64) ([]Row, error) // [minID, maxID] SaveRows(ctx context.Context, rows []Row) error } func Connect(ctx context.Context, dbname string) (Database, error) // CopyTable // Jei full=false, tęsti duomenų perkėlimą nuo ankstesnės klaidos vietos // Jei full=true, perkelti visus duomenis func CopyTable(fromName string, toName string, full bool) error { // ... jūsų kodas } Jei perduodama parinktis `full=false`, programa turi tęsti duomenų perkėlimą nuo ankstesnės klaidos vietos. Jei `full=true`, turi perkelti visus duomenis. **Pagrindinis lygis**: - duomenų sekos perkėlimas vienu srautu - atkūrimas po klaidos (parinktis `full=false`) Papildoma informacija: - jei reikia, galite išplėsti sąsają pridėdami savo metodus - jei reikia, galite naudoti tiesiogiai paketą **database/sql**

211

/* Duotas simbolių eilutė. Raskite porų indeksų i ir j (i <= j) skaičių, tarp kurių nėra pasikartojančių simbolių. Eilutės "aba" atveju atsakymas yra 5: gali būti ne tik ASCII [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") */

211

Duota simbolių eilutė. Suraskite indeksų i ir j porą (i <= j), tarp kurių, įskaitant, nėra pasikartojančių simbolių. Eilutės "aba" atsakymas yra 5: [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") Eilutės "abcb" atsakymas yra ?: aba 3 + 2 = 5 abcb 4 (a, b, c, d) + 1 (ab) + 1 (bc) + 1 (cb) + 1 (abc) = 8

209

/* Yra taikymas su mikroservisų architektūra. Mikroservisas gali būti abstrakčiai apibrėžtas naudojant Backend sąsają. Norint pasiekti mikroserviso egzempliorių, galima naudoti jau įgyvendintą BackendImpl tipą. Kiekvienas mikroservisas turi kelias dešimtis veikiančių egzempliorių, kurių kiekvienas pasiekiamas per savo adresą addr. Tačiau atskiros mikroserviso egzemplioriai nėra patikimi: jie gali kristi, būti neprieinami arba perkrauti. Todėl jums reikia įgyvendinti Balancer tipą, kuris taip pat įgyvendina Backend sąsają ir atlieka kliento pusės apkrovos balansavimą tarp mikroserviso egzempliorių, kiekvieną kartą pasirenkant **mažiausiai apkrautą** egzempliorių. */ type Request interface{} type Response interface{} type Backend interface { Invoke(ctx context.Context, req Request) (Response, error) } var _ Backend = &BackendImpl{} // addr saugo konkretaus egzemplioriaus ip:port adresą func NewBackend(addr string) *BackendImpl type Balancer struct { // TODO } var _ Backend = &Balancer{} // addrs saugo visų balansuojamų egzempliorių adresus func NewBalancer(addrs []string) *Balancer { // TODO }

209

Kaip veikia WebSocket ryšys architektūroje — kada jis nustatomas ir kas su kuo bendrauja?

209

Ar turite patirties dirbant su paskirstytomis sistemomis?

209

Skaidomaus kurti mastelį siuntimo sistemą, kuri palaiko 150 milijonų vartotojų, 75 milijonų DAU, 225 milijonų MAU, 1,2 milijono peak QPS skaitymo / 300k rašymo, 5 milijonų vienu metu naudotojų, 60 PB naujų duomenų per metus, 30% metinį augimą, SLA 99,95%, p99 <200 ms skaitymui, <300 ms rašymui. KONTEKSTAS Reikia sukurti paskirstytą žinučių sistemą, panašią į WhatsApp, kuri palaiko 1:1 ir grupinius pokalbius, užtikrina žinučių pristatymą, rodo naudotojų būsenas ir leidžia perduoti multimedijos failus (nuotraukas, vaizdo įrašus, garsus). Sistema turi užtikrinti aukštą prieinamumą ir žemą delsą, palaikyti didelį paralelizmą ir būti skalaujama globaliai. FUNKCINIAI REIKALAVIMAI - Palaikymas asmeninių (1:1) ir grupinių pokalbių su galimybe pridėti/pašalinti dalyvius - Tekstinių žinučių ir multimedijos failų siuntimas ir gavimas Aiškus end-to-end šifravimo mechanizmo įgyvendinimas paslaugų ar klientų lygyje nėra matomas, išskyrus bendrą pastabą. - Trūksta aiškaus aprašymo apie sharding ir replikaciją duomenų bazėse pagal chat_id ar user_id, siekiant mastelio ir atsparumo klaidoms. - Nėra aiškios komponento ar mechanizmo offline žinučių sinchronizacijai ir pristatymo patvirtinimams. - Neaišku, kaip vyksta apkrovos paskirstymas tarp duomenų bazių ir paslaugų, ypač piko metu. **Kritinės vietos, kurias reikėtų apsvarstyti:**

209

Ar turite patirties vadovaujant komandai?

208
/11