Sobes.tech

Golang

/** :-))) :-(( "ab :-)" = "ab " "ab :-)))" = "ab " "ab :-)))(" = "ab (" "ab ):-)" = "ab )" ":-)" = "" **/ func deleteP(str string) string { }

230

Jak działa połączenie WebSocket w architekturze — w którym momencie jest ono ustanawiane i kto z kim się komunikuje?

229

// Dane są dwie posortowane sekwencje liczb całkowitych w porządku nierosnącym. // Należy zwrócić wszystkie elementy z pierwszej sekwencji, których nie ma w drugiej. // 0 <= N <= 10^6 // -10^9 <= a[i] <= 10^9 // [1] // [2, 3, 4, 5, 6] // [1] // [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ...] // [1] // [2, 3, 4, 5, 6, 7, 8] func filter(first []int, second []int) []int { res := make([]int, 0, len(first)) i, j := 0, 0 for i < len(first) && j < len(second) { if first[i] < second[j] { result = append(result, first[i]) i++ } else if first[i] > second[j] { j++ } else { i++ j++ } } for i < len(first) { result = append(result, first[i]) i++ } return result }

228

Jak przesuwać okno w algorytmie sliding window?

228

Opowiedz o najtrudniejszym i najbardziej interesującym zadaniu, które rozwiązałeś, szczególnie w zakresie doświadczenia architektonicznego.

227

Funkcja przyjmująca dwie posortowane rosnąco sekwencje liczb całkowitych. Należy zwrócić wszystkie elementy z pierwszej sekwencji, których nie ma w drugiej. Jak podejdziesz do rozwiązania i jaka będzie złożoność?

226

Czy mógłbyś podać swój aktualny poziom dochodu?

Junior — Middle
225

Czy obecnie mieszkasz w Moskwie? Jakie miasto rozważasz? Rozważasz hybrydowy format pracy? Na jakim etapie poszukiwań jesteś?

225

Czy masz inne aktywne procesy rekrutacyjne?

224

Jaki jest problem z obecną implementacją aktualizacji mapy w workerze (tasksRes[t.id][task{...}])?

224

Jak te metryki są integrowane i wyświetlane w Grafanie?

Junior — Middle
223

Projektowanie skalowalnego systemu komunikacji obsługującego 150 mln użytkowników, 75 mln DAU, 225 mln MAU, 1,2 mln odczytów / 300 tys. zapisów QPS, 5 mln użytkowników jednoczesnych, 60 PB nowych danych rocznie, wzrost o 30% rocznie, P99 <200 ms dla odczytu, <300 ms dla zapisu, SLA 99,95%. KONTEKST Należy zaprojektować rozproszony system komunikacji, podobny do WhatsApp, obsługujący czaty 1:1 i grupowe, zapewniający dostarczanie wiadomości, wyświetlanie statusów online użytkowników i przesyłanie plików multimedialnych (zdjęcia, wideo, audio). System musi zapewniać wysoką dostępność i niskie opóźnienia, obsługiwać wysoki poziom równoległości i skalować na poziomie globalnym. WYMAGANIA FUNKCYJNE - Obsługa czatów osobistych (1:1) i grupowych z możliwością dodawania/usuwania uczestników - Wysyłanie i odbieranie wiadomości tekstowych i plików multimedialnych Wymagania niefunkcjonalne: - Brak wyraźnej implementacji szyfrowania end-to-end na poziomie usług lub klientów, oprócz ogólnej adnotacji. - Brak jasnego opisu sharding i replikacji baz danych według chat_id lub user_id dla skalowalności i odporności na awarie. - Brak wyraźnego komponentu lub mechanizmu do obsługi offline synchronizacji wiadomości i potwierdzeń dostarczenia. - Nie jest jasne, jak realizowane jest równoważenie obciążenia między bazami danych a usługami, szczególnie przy szczytowych obciążeniach. **Ważne punkty do rozważenia:** (Diagram przedstawia architekturę z Load Balancer, API Gateway, Message Queue, Service, Cache, Database, Object Storage i CDN)

222

Czy masz aktywnego GitHub lub LinkedIn?

222

Jaki był skład zespołu, z którym ostatnio pracowałeś?

Junior — Middle
221

[imię] wskazał na niezgodność w ocenie pamięci: oświadczył jedno, napisał coś innego. Jak prawidłowo ocenić pamięć?

217

Opowiedz o swoim ostatnim projekcie — na czym polega i czym dokładnie się zajmujesz?

217

Opowiedz krótko, czym zajmowałeś się w poprzednich miejscach pracy i jakie funkcje zaimplementowałeś.

216

Czy masz doświadczenie w pracy z systemami rozproszonymi?

215

Projekt skalowalnego systemu wiadomości obsługującego 150 mln użytkowników, 75 mln DAU, 225 mln MAU, 1,2 mln odczytów / 300 tys. zapisów szczytowych QPS, 5 mln użytkowników jednocześnie, 60 PB nowych danych rocznie, roczny wzrost o 30%, SLA 99,95%, p99 <200 ms dla odczytu, <300 ms dla zapisu. KONTEKST Należy zaprojektować rozproszony system wiadomości, podobny do WhatsApp, obsługujący czaty 1:1 i grupowe, zapewniający dostarczanie wiadomości, wyświetlanie statusów online użytkowników i przesyłanie plików multimedialnych (zdjęcia, wideo, audio). System musi zapewniać wysoką dostępność i niskie opóźnienia, obsługiwać wysoki poziom równoległości i skalować na poziomie globalnym. WYMAGANIA FUNKCYJNE - Obsługa czatów osobistych (1:1) i grupowych z możliwością dodawania/usuwania uczestników - Wysyłanie i odbieranie wiadomości tekstowych i plików multimedialnych Brak wyraźnej implementacji mechanizmu end-to-end encryption na poziomie usług lub klientów, poza ogólną adnotacją. - Brak wyraźnego opisu sharding i replikacji baz danych według chat_id lub user_id dla skalowalności i odporności na awarie. - Brak wyraźnego komponentu lub mechanizmu do obsługi offline'owej synchronizacji wiadomości i potwierdzeń dostarczenia. - Nie jest jasne, jak realizowane jest równoważenie obciążenia między bazami danych a usługami, szczególnie przy szczytowych obciążeniach. **Krytyczne punkty do rozważenia:**

215

/* Są dwa serwery PostgreSQL: * PROD - serwer OLTP, * STATS - serwer do długich zapytań analitycznych. Na aktualnym serwerze, w bazie danych prod, znajduje się duża tabela (10Tb) o następującej strukturze: CREATE TABLE profiles( id SERIAL, data JSONB ) W tabeli mogą występować "luki", tzn. niektóre `id` mogą być pominięte. Należy napisać program do kopiowania tabeli profiles z PROD do STATS. Zakłada się, że do pracy z bazami danych będą używane następujące interfejsy: type Row []interface{} type Database interface { // implementacja interfejsu Database może ponownie ustanawiać połączenia // wywołanie SaveRows jest idempotentne 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 // Jeśli full=false, kontynuować transfer danych od miejsca poprzedniego błędu // Jeśli full=true, przenieść wszystkie dane func CopyTable(fromName string, toName string, full bool) error { // ... twój kod } Jeśli przekazana jest opcja `full=false`, program powinien kontynuować transfer danych od miejsca poprzedniego błędu. Jeśli `full=true`, powinien przenieść wszystkie dane. **Podstawowy poziom**: - sekwencyjny transfer danych w jednym strumieniu - odzyskiwanie po błędach (opcja `full=false`) Dodatkowe informacje: - w razie potrzeby można rozbudować interfejs, dodając własne metody - w razie potrzeby można używać bezpośrednio pakietu **database/sql**

215
/11