Sobes.tech

Golang

Máte skúsenosti s distribuovanými systémami?

215

/* PostgreSQL-ové dva serveri: * PROD - OLTP server, * STATS - server pre dlhých analytických dopytov. Na aktuálnom serveri, v databáze prod, je veľká tabuľka (10Tb) s nasledujúcou štruktúrou: CREATE TABLE profiles( id SERIAL, data JSONB ) V tabuľke môžu byť "dierky", t.j. niektoré `id` môžu byť vynechané. Je potrebné napísať program na kopírovanie tabuľky profiles z PROD na STATS. Predpokladá sa, že sa budú používať nasledujúce rozhrania na prácu s databázami: type Row []interface{} type Database interface { // implementácia rozhrania Database môže znovu nadviazať spojenia // volanie SaveRows je idempotentné 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 // Ak je full=false, pokračovať v prenose dát od miesta predchádzajúcej chyby // Ak je full=true, preniesť všetky dáta func CopyTable(fromName string, toName string, full bool) error { // ... váš kód } Ak je zadaná voľba `full=false`, program by mal pokračovať v prenose dát od miesta predchádzajúcej chyby. Ak je `full=true`, mal by preniesť všetky dáta. **Základná úroveň**: - sekvenčný prenos dát v jednom toku - zotavenie po chybe (voľba `full=false`) Dodatočné informácie: - ak je potrebné, môžete rozšíriť rozhranie pridaním vlastných metód - ak je potrebné, môžete priamo použiť balík **database/sql**

215

Daný je reťazec znakov. Nájdite počet párov indexov i a j (i <= j), medzi ktorými, vrátane, nie sú opakujúce sa znaky. Pre reťazec "aba" je odpoveď 5: [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") Pre reťazec "abcb" je odpoveď ?: aba 3 + 2 = 5 abcb 4 (a, b, c, d) + 1 (ab) + 1 (bc) + 1 (cb) + 1 (abc) = 8

213

/* Dodaný je reťazec znakov. Nájdite počet párov indexov i a j (i <= j), medzi ktorými nie sú opakujúce sa znaky. Pre reťazec "aba" je odpoveď 5: môžu to byť nielen ASCII [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") */

213

/* Musíme preniesť údaje zo zdroja k spotrebiteľovi. Zdroj poskytuje údaje v malých dávkach (~desať záznamov), zatiaľ čo spotrebiteľ efektívnejšie pracuje s väčšími dávkami (~tisíc záznamov). Reálny príklad je prenos údajov z front typu Kafka do databázy Clickhouse. Zdroj: - Takmer nekonečný. - Zdroj nikdy nevráti viac ako MaxItems záznamov v jednom volaní Next. - V rámci jednej "relácie" (jedno volanie funkcie Pipe) zdroj pri každom Next vracia nové údaje. - Po reštarte však zdroj začína od predchádzajúcej "potvrdenej" pozície, označenej cookie. Preto, každá hodnota cookie, vrátená od Next, po uložené údajoch do príjemcu, musí byť potvrdená volaním na Commit, v rovnakom poradí, v akom boli vrátené od Next. Prijímateľ: - Nedokáže spracovať viac ako MaxItems naraz. Základná úroveň: Je potrebné implementovať funkciu func Pipe(p Producer, c Consumer) error, ktorá číta údaje zo zdroja, ich zoskupuje do bufferu veľkosti nie väčšej ako MaxItems a ich ukladá do príjemcu, po čom potvrdzuje pokrok v zdroji. Zložitosť: Metódy Next, Process a Commit sú spojené s sieťovými volaniami a môžu trvať dosť dlho. Na zrýchlenie procesu je potrebné paralelizovať procesy čítania, zápisu a potvrdenia pokroku. Tak, aby počas Process alebo Commit pokračovalo čítanie zo zdroja a tvorba nového bufferu. */ const MaxItems = 9999 type Producer interface { // Next vráti: // - dávku položiek na spracovanie // - cookie na potvrdenie, keď je spracovanie dokončené // - chybu Next() (items []any, cookie int, err error) // Commit sa používa na označenie dávky dát ako spracovaných Commit(cookie int) error } type Consumer interface { Process(items []any) error } func Pipe(p Producer, c Consumer) error { // TODO }

213

Vysvetlite princíp invertovania závislostí a prečo priame volanie metód repozitára z prípadu použitia porušuje SOLID.

212

Povej mi o bazah podatkov — s katerimi si delal in s katerimi trenutno delaš?

212

V čom sa líšia prostredia local, dev, stage, prod?

211

Ako ste vykonali testovanie a overenie správnosti vykonaných požiadaviek?

Junior — Middle
211

/* Existuje aplikácia s architektúrou mikroservisov. Mikroservis možno abstrahovať pomocou rozhrania Backend. Na prístup k inštancii mikroservisu môžete použiť typ BackendImpl, ktorý je už implementovaný. Každý mikroservis má niekoľko desiatok bežiacich inštancií, z ktorých každá je dostupná na svojej adrese addr. Avšak, jednotlivé inštancie mikroservisu nie sú spoľahlivé: môžu zlyhať, byť nedostupné alebo preťažené. Preto musíte implementovať typ Balancer, ktorý tiež implementuje rozhranie Backend a vykonáva vyvažovanie záťaže na strane klienta medzi inštanciami mikroservisu, pričom vždy vyberá **najmenej zaťaženú** inštanciu. */

210

Ako JWT overuje svoju pravosť? Ako sa zabezpečí, že token nebol sfalšovaný?

210

/* Existuje aplikácia s architektúrou mikroservisov. Mikroservis môže byť abstraktný pomocou rozhrania Backend. Na prístup k inštancii mikroservisu môžete použiť typ BackendImpl, ktorý je už implementovaný. Každý mikroservis má niekoľko desiatok bežiacich inštancií, z ktorých každá je dostupná na svojej adrese addr. Avšak jednotlivé inštancie mikroservisu nie sú spoľahlivé: môžu zlyhať, byť nedostupné alebo preťažené. Preto musíte implementovať typ Balancer, ktorý tiež implementuje rozhranie Backend a vykonáva vyvažovanie záťaže na strane klienta medzi inštanciami mikroservisu, pričom vždy vyberá **najmenej zaťaženú** inštanciu. */ type Request interface{} type Response interface{} type Backend interface { Invoke(ctx context.Context, req Request) (Response, error) } var _ Backend = &BackendImpl{} // addr obsahuje ip:port konkrétnej inštancie func NewBackend(addr string) *BackendImpl type Balancer struct { // TODO } var _ Backend = &Balancer{} // addrs obsahujú adresy všetkých vyvážených inštancií func NewBalancer(addrs []string) *Balancer { // TODO }

209

Mal(a) ste skúsenosti s riadením tímu?

208

Aké je obmedzenie semafora a vyrovnávacieho kanála ako riešenia na obmedzenie paralelných požiadaviek?

208

Čo sa pridá do odpovede, keď sa okno stane platným?

207

Ako porovnať prvky v mape? Ako skontrolovať, či sa dve mapy zhodujú?

205

Aké je maximálne množstvo požiadaviek za sekundu (RPS), ktoré spracoval najzaťaženejší servis?

204

Napíšte úlohu v jazyku Go — praktická sekcia (problémy z života vývojára, bez algoritmov): vylepšiť alebo opraviť službu. Dĺžka — 1,5 hodiny.

204

Formát práce: na diaľku, v kancelárii alebo hybridne?

203

Ako spraviť pamäť konštantnou (odstrániť závislosť od počtu jedinečných znakov)?

203
/11