Sobes.tech

Golang

/* Két PostgreSQL szerver van: * PROD - OLTP szerver, * STATS - szerver hosszú elemző lekérdezésekhez. A jelenlegi szerveren, a prod adatbázisban, van egy nagy (10Tb) táblázat a következő szerkezettel: CREATE TABLE profiles( id SERIAL, data JSONB ) A táblában lehetnek "lyukak", azaz néhány `id` hiányzik. Írjon egy programot a profiles tábla másolására a PROD-ról a STATS-re. Feltételezzük, hogy a következő interfészeket fogjuk használni az adatbázisokkal való munkához: type Row []interface{} type Database interface { // a Database interfész implementációja újra kapcsolatokat állíthat helyre // a SaveRows hívás idempotens 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 // Ha full=false, folytassa az adatok átvitelét a korábbi hiba helyétől // Ha full=true, az összes adatot át kell vinni func CopyTable(fromName string, toName string, full bool) error { // ... a kódod } Ha a `full=false` opciót adjuk meg, a programnak folytatnia kell az adatok átvitelét a korábbi hiba helyétől. Ha `full=true`, akkor az összes adatot át kell vinni. **Alapszint**: - szekvenciális adatátvitel egyetlen folyamként - hibák utáni helyreállítás (opció `full=false`) További információk: - szükség esetén bővítheted az interfészt saját módszerek hozzáadásával - szükség esetén közvetlenül használhatod a **database/sql** csomagot

217

Mesélj röviden az előző munkahelyeiden végzett tevékenységeidről és az általad megvalósított funkciókról.

216

Hogyan végezte el a kérések helyességének tesztelését és ellenőrzését?

Junior — Middle
215

Mesélj az adatbázisokról — mivel dolgoztál és mivel dolgozol most?

214

Miben különböznek a local, dev, stage, prod környezetek?

213

/* Adott egy karakterlánc. Határozd meg az i és j indexpárok számát (i <= j), amelyek között nincsenek ismétlődő karakterek. A "aba" karakterlánc esetén a válasz 5: nem csak ASCII lehet [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") */

213

/* Adatokat kell átvinni egy forrásból egy fogyasztóhoz. A forrás kis csomagokban (~tíz rekord) adja az adatokat, míg a fogyasztó hatékonyabban működik nagyobb csomagokkal (~ezer rekord). Egy valódi példa a Kafka típusú sorokból származó adatok átadása a Clickhouse adatbázisba. Forrás: - Szinte végtelen. - A forrás soha nem ad vissza több mint MaxItems rekordot egy Next hívásban. - Egy "munkamenet" (egy Pipe függvényhívás) során a forrás minden Next hívásnál új adatokat ad. - Azonban újraindítás után a forrás a korábbi "megerősített" pozícióból kezd, amit a cookie határoz meg. Ezért minden Next által visszaadott cookie érték, miután az adatokat a fogadóba mentettük, a Commit hívással kell megerősíteni, ugyanabban a sorrendben, ahogyan a Next visszaadta. Fogadó: - Nem képes egyszerre több mint MaxItems adatot feldolgozni. Alapszint: Implementálni kell a func Pipe(p Producer, c Consumer) error függvényt, ami adatokat olvas a forrásból, azokat MaxItems-nél nem nagyobb bufferbe gyűjti, és a fogadóba menti, és ezt követően megerősíti a haladást a forrásban. Különlegesség: A Next, Process és Commit metódusok hálózati hívásokhoz kötöttek, és elég hosszú ideig tarthatnak. A folyamat felgyorsítása érdekében párhuzamosítani kell az olvasási, írási és haladási megerősítési folyamatokat. Így, a Process vagy Commit hívás közben, az olvasás a forrásból és az új buffer kialakítása folytatódhat. */ const MaxItems = 9999 type Producer interface { // Next visszaad: // - egy csomag elemet az feldolgozásra // - egy cookie-t, amit a feldolgozás befejezése után kell megerősíteni // - egy hibát Next() (items []any, cookie int, err error) // Commit a feldolgozott adatcsomagot jelöli meg Commit(cookie int) error } type Consumer interface { Process(items []any) error } func Pipe(p Producer, c Consumer) error { // TODO }

213

Magyarázd el az függőségek fordított elvét, és miért sérti a SOLID elvet, ha közvetlenül hívod meg a repository metódusait use case-ből.

212

Mit adnak hozzá a válaszhoz, amikor az ablak érvényessé válik?

211

/* Van egy alkalmazás mikroservice architektúrával. Egy mikroservice-t az Backend interfész segítségével lehet absztrahálni. A mikroservice példányához a BackendImpl típus használható, amely már meg van valósítva. Minden mikroservice-nek több tucat futó példánya van, amelyek mindegyike saját címén, az addr-en keresztül érhető el. Azonban a mikroservice egyes példányai nem megbízhatóak: lehetnek leállások, elérhetetlenség vagy túlterheltség. Ezért meg kell valósítanod egy Balancer típusát, amely szintén megvalósítja a Backend interfészt, és kliensoldali terheléselosztást végez a mikroservice példányai között, minden alkalommal a **legkevésbé terhelt** példányt kiválasztva. */

210

Hogyan ellenőrzi a JWT azonosítottságát? Hogyan biztosítja, hogy a token nem hamisított?

210

/* Egy alkalmazás mikroservice architektúrával rendelkezik. Egy mikroservice abstrakcionálható a Backend interfész segítségével. A mikroservice példányának eléréséhez használhatja a már megvalósított BackendImpl típust. Minden mikroservice-nek több tucat futó példánya van, amelyek mindegyike saját címen érhető el, addr. Azonban az egyes példányok nem megbízhatóak: lehetnek leállások, elérhetetlenségek vagy túlterheltségek. Ezért meg kell valósítania a Balancer típust, amely szintén megvalósítja a Backend interfészt, és kliensoldali terheléselosztást végez a mikroservice példányai között, minden alkalommal a **legkevésbé terhelt** példányt kiválasztva. */ type Request interface{} type Response interface{} type Backend interface { Invoke(ctx context.Context, req Request) (Response, error) } var _ Backend = &BackendImpl{} // addr egy adott példány ip:port címe func NewBackend(addr string) *BackendImpl type Balancer struct { // TODO } var _ Backend = &Balancer{} // addrs tartalmazza az összes kiegyensúlyozott példány címét func NewBalancer(addrs []string) *Balancer { // TODO }

209

Mekkora volt a legnagyobb kérés szám másodpercenként (RPS), amit a legnagyobb terhelésű szolgáltatás kezelt?

208

Mi a korlátja a szeminárnak és a pufferelt csatornának, mint megoldások a párhuzamos kérések korlátozására?

208

Hogyan hasonlítjuk össze a térképen lévő elemeket? Hogyan ellenőrizzük, hogy két térkép egyezik-e?

205

Írjon feladatot Go nyelven — gyakorlati szakasz (fejlesztő életéből vett problémák, algoritmusok nélkül): javítson vagy javítson egy szolgáltatást. Időtartam — 1,5 óra.

204

Milyen volt a csapat összetétele? Egyszerű vagy többfunkciós volt?

204

Munkavégzés formája: távoli, irodai vagy hibrid?

203
/11