Vai jums ir pieredze ar izplatītām sistēmām?
Golang
/* PostgreSQL-ā ir divi serveri: * PROD - OLTP serveris, * STATS - serveris ilgām analītiskajām vaicājumiem. Pašreizējā serverī, prod datu bāzē, ir liela (10Tb) tabula ar šādu struktūru: CREATE TABLE profiles( id SERIAL, data JSONB ) Tabulā var būt "caurumi", t.i., dažiem `id` var būt izlaisti. Ir nepieciešams uzrakstīt programmu, kas kopē tabulu profiles no PROD uz STATS. Pieņemts, ka tiks izmantoti šādi interfeisi darbam ar datu bāzēm: type Row []interface{} type Database interface { // realizācija var atkārtoti izveidot savienojumus // SaveRows izsaukums ir idempotents 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 // Ja full=false, turpināt datu pārnešanu no iepriekšējās kļūdas vietas // Ja full=true, pārnest visus datus func CopyTable(fromName string, toName string, full bool) error { // ... jūsu kods } Ja tiek nodota opcija `full=false`, programmai jāturpina datu pārnešana no iepriekšējās kļūdas vietas. Ja `full=true`, jāpārnes visi dati. **Pamata līmenis**: - secīgs datu pārnešanas process vienā plūsmā - atjaunošana pēc kļūdas (opcijas `full=false`) Papildu informācija: - ja nepieciešams, vari paplašināt interfeisu, pievienojot savas metodes - ja nepieciešams, vari tieši izmantot **database/sql** paketi
Dotā ir rakstzīmju virkne. Atrodiet indeksu i un j pāri (i <= j), starp kuriem, ieskaitot, nav atkārtotu rakstzīmju. "aba" virknes gadījumā atbilde ir 5: [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") "abcb" virknes gadījumā atbilde ir ?: aba 3 + 2 = 5 abcb 4 (a, b, c, d) + 1 (ab) + 1 (bc) + 1 (cb) + 1 (abc) = 8
/* Dota ir rakstzīmju virkne. Atrodi indeksu pāru i un j skaitu (i <= j), starp kuriem nav atkārtotu rakstzīmju. "aba" virknei atbilde ir 5: var nebūt tikai ASCII [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") */
/* Mums nepieciešams nodot datus no noteikta avota noteiktam patērētājam. Šajā gadījumā avots sniedz mazākas partijas (~ desmitiem ierakstu), bet patērētājs efektīvāk strādā ar lielākām partijām (~ tūkstošiem ierakstu). Reāls piemērs - datu nodošana no Kafka tipa rindām uz Clickhouse datu bāzi. Avots: - Puslīdz bezgalīgs. - Avots nekad neatgriež vairāk par MaxItems ierakstiem vienā Next izsaukumā. - Vienā "sesijā" (viena Pipe funkcijas izsaukuma laikā) avots katru reizi atgriež jaunus datus. - Tomēr, pārstartējot, avots atsāks no iepriekšējās "apstiprinātās" pozīcijas, kas norādīta ar cookie. Tādēļ katra vērtība, ko atgrieza Next izsaukums, pēc datu saglabāšanas saņēmējam, ir jāapstiprina ar Commit izsaukumu, un tas jāveic tieši tajā pašā secībā, kurā tie tika atgriezti ar Next. Saņēmējs: - Nevar apstrādāt vairāk par MaxItems vienlaikus. Galvenais līmenis: Jāievieš funkcija func Pipe(p Producer, c Consumer) error, kura lasa datus no avota, tos grupē buferī, kura izmērs nav lielāks par MaxItems, un saglabā saņēmējā, tad atjauno progresu avotā. Grūtības: Next, Process un Commit metodes ir saistītas ar tīkla izsaukumiem un var darboties diezgan ilgi. Lai paātrinātu datu pārraidi, nepieciešams paralēli veikt lasīšanu, ierakstīšanu un apstiprināšanu. Tādējādi, izsaucot Process vai Commit, turpinās lasīšana no avota un jauna bufera veidošana. */
Izskaidrojiet atkarības inversijas principu un kāpēc tieša piekļuve repozitora metodēm no lietošanas gadījuma pārkāpj SOLID.
Pastāsti par datu bāzēm — ar ko esi strādājis un ar ko šobrīd strādā?
Kādas ir atšķirības starp local, dev, stage, prod vidi?
Kā jūs veicāt izpildīto pieprasījumu pareizības testēšanu un verifikāciju?
/* Ir ir aplikācija ar mikroservisu arhitektūru. Mikroserviss var tikt abstraktirots ar Backend saskarni. Lai piekļūtu mikroservisa eksemplāram, var izmantot tipu BackendImpl, kas jau ir realizēts. Katrs mikroserviss ir vairākas desmiti darbojošu eksemplāru, katrs pieejams ar savu adresi addr. Tomēr, atsevišķi mikroservisa eksemplāri nav uzticami: tie var krist, būt nepieejami vai pārslogoti. Tādēļ jums jārealizē tips Balancer, kas arī realizē Backend saskarni un veic klienta puses slodzes līdzsvarošanu starp mikroservisa eksemplāriem, katru reizi izvēloties **mazāk noslogoto** eksemplāru. */
Kā JWT pārbauda savu autentiskumu? Kā pārliecināties, ka tokens nav viltots?
/* Ir ir pastāv lietojumprogramma ar mikroservisu arhitektūra. Mikroserviss var tikt apstrādāts ar Backend interfeisa palīdzību. Lai piekļūtu mikroservisa eksemplāram, var izmantot jau realizēto BackendImpl tipu. Katrs mikroserviss ir vairākas desmiti darbojošu eksemplāru, katrs pieejams ar savu adresi addr. Tomēr atsevišķi mikroservisa eksemplāri nav uzticami: tie var krist, būt nepieejami vai pārslogoti. Tādēļ jums jārealizē Balancer tips, kas arī realizē Backend interfeisu un veic klienta puses slodzes līdzsvarošanu starp mikroservisa eksemplāriem, katru reizi izvēloties **mazāk noslogoto** eksemplāru. */ type Request interface{} type Response interface{} type Backend interface { Invoke(ctx context.Context, req Request) (Response, error) } var _ Backend = &BackendImpl{} // addr satur konkrēta eksemplāra ip:port adresi func NewBackend(addr string) *BackendImpl type Balancer struct { // TODO } var _ Backend = &Balancer{} // addrs satur visu balansēto eksemplāru adreses func NewBalancer(addrs []string) *Balancer { // TODO }
Vai jums ir pieredze komandas vadīšanā?
Kāda ir semafora un buferizētā kanāla ierobežojumi kā risinājumi paralēlo pieprasījumu ierobežošanai?
Ko pievieno atbildei, kad logs kļūst derīgs?
Kā salīdzināt elementus kartē? Kā pārbaudīt, vai divi kartes sakrīt?
Kāda ir maksimālā pieprasījumu skaits sekundē (RPS), ko apstrādāja visvairāk noslogotā pakalpojuma?
Rakstiet uzdevumu Go valodā — praktiskā sadaļa (izstrādātāja dzīves problēmas, bez algoritmiem): uzlabot vai labot pakalpojumu. Ilgums — 1,5 stundas.
Darba formāts: attālināti, birojā vai hibrīds?
Kā padarīt atmiņu pastāvīgu (noņemt atkarību no unikālo rakstzīmju skaita)?