Sobes.tech

Қазіргі табыс деңгейіңізді айта аласыз ба?

Junior — Middle
223

Қазіргі уақытта Мәскеуде тұрасыз ба? Қандай қалаға қарайсыз? Гибридті жұмыс форматын қарастырасыз ба? Жұмыс іздеу қай кезеңінде тұрсыз?

223

Басқа белсенді сұхбаттасу процестеріңіз бар ма?

222

Бұл метрикалар қалай біріктіріліп, Grafana-да көрсетіледі?

Junior — Middle
221

Масштабталатын мессенджерді жобалау, 150 миллион пайдаланушыны, 75 миллион DAU, 225 миллион MAU, 1.2 миллион оқуды / 300 мың жазуды QPS, 5 миллион бір уақытта пайдаланушылар, жылына 60 ПБ жаңа деректер, жылына 30% өсім, P99 <200 мс оқуға, <300 мс жазуға, SLA 99.95% қолдауымен. КОНТЕКСТ WhatsApp-қа ұқсас таралған жүйені жобалау қажет, ол 1:1 және топтық чаттарды қолдайды, хабарламаларды жеткізуді, пайдаланушылардың онлайн-статустарын көрсету және мультимедиялық файлдарды (сурет, видео, аудио) жіберуді қамтамасыз етеді. Жүйе жоғары қолжетімділік пен төмен кідіріспен жұмыс істеуі керек, жоғары параллелизмді қолдап, ғаламдық деңгейде масштабталуы керек. ФУНКЦИОНАЛДЫҚ ТАЛАПТАР - Жеке (1:1) және топтық чаттарды қолдау, қатысушыларды қосу/алу мүмкіндігімен - Мәтіндік хабарламалар мен мультимедиялық файлдарды жіберу және алу Нефункционалдық талаптар: - Қызметтер немесе клиенттер деңгейінде end-to-end шифрлау механизмі нақты жүзеге асырылмаған, жалпы аннотациядан басқа. - chat_id немесе user_id бойынша дерекқорларды шардинг және репликация туралы нақты сипаттама жоқ, масштабталу және ақауларға төзімділікті қамтамасыз ету үшін. - Офлайн-синхрондау хабарламалары мен жеткізу түбіртектерін өңдеу үшін нақты компонент немесе механизм жоқ. - Жүктеме теңестірудің қалай жүзеге асырылатыны, әсіресе пиктік жүктемелер кезінде, дерекқорлар мен қызметтер арасында байқалмайды. **Назар аудару керек шектеулі жерлер:** (Келесі диаграммада Load Balancer, API Gateway, Message Queue, Service, Cache, Database, Object Storage және CDN архитектурасы көрсетілген)

220

Сіз қандай операциялар саны бойынша секундқа көрсеткішке жеттіңіз немесе талдадыңыз?

Middle — Middle+
220

Соңғы рет жұмыс істеген командаңыздың құрамы қандай болды?

Junior — Middle
219

Сізде белсенді GitHub немесе LinkedIn бар ма?

218

Алдыңғы жұмыс орындарында не істегеніңізді, қандай функцияларды жүзеге асырғаныңызды қысқаша айта аласыз ба?

214

Командада тестілер қалай ұйымдастырылған — кім не жазады, қандай қамту, E2E бар ма?

213

/ * Бізге деректерді бір көзден алатын және оны тұтынушыға жеткізетін жүйе керек. Бұл кезде көз шағын топтамалармен (~онша жазбалар), ал тұтынушы үлкен батчтармен (~мыңдаған жазбалар) жұмыс істеуге тиімді. Шынайы мысал — Kafka сияқты кезектерден деректерді Clickhouse базасына жеткізу. Көз: - Шартты түрде шексіз. - Көз әр шақырғанда MaxItems-тан көп емес жазбаны қайтармайды. - Бір "сессия" (бір Pipe функциясының шақырылуы) ішінде көз әр шақырғанда жаңа деректер қайтарылады. - Алайда, қайта іске қосқанда көз өткен "расталған" позициядан бастайды, ол cookie арқылы анықталады. Сондықтан, Next шақырған кезде қайтарылған әрбір cookie мәні, деректер қабылдағышқа сақталғаннан кейін, Commit шақыруымен нақты белгіленуі керек, және оларды Next қайтарған тәртіпте ғана орындау керек. Қабылдағыш: - MaxItems-тан көп емес деректерді бір рет өңдей алады. Негізгі деңгей: func Pipe(p Producer, c Consumer) error функциясын жүзеге асыру керек, ол көзден деректерді оқиды, оларды MaxItems-ке дейінгі буферге топтайды және қабылдағышқа сақтайды, сонан соң көздегі прогресті белгілейді. Қиындату: Next, Process және Commit әдістері желілік шақырулармен байланысты және ұзақ уақыт жұмыс істей алады. Деректерді тасымалдау процесін жеделдету үшін оқуды, жазуды және прогресті растауды параллель жүргізу керек. Мысалы, Process немесе Commit шақырылған кезде, көзден оқуды және жаңа буфер құруды жалғастыру керек. * /

213

Map деректер құрылымында элементтерді іздеудің тиімділігін арттыру үшін қандай әдістер қолдануға болады?

Junior — Middle
211

/* Екі PostgreSQL сервері бар: * PROD - OLTP сервері, * STATS - ұзақ аналитикалық сұраулар үшін сервер. Қазіргі сервердегі prod дерекқорында үлкен (10Tb) кесте бар: CREATE TABLE profiles( id SERIAL, data JSONB ) Кестеде "жарықтар" болуы мүмкін, яғни кейбір `id` пропущены болуы мүмкін. PROD-тан STATS-қа profiles кестесін көшіру үшін бағдарлама жазу керек. Дерекқорлармен жұмыс істеу үшін келесі интерфейстер пайдаланылады: type Row []interface{} type Database interface { // интерфейсінің жүзеге асырылуы қосылуларды қайта орнатуды біледі // SaveRows шақыруы идемпотентті 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 // Егер full=false болса, онда деректерді алдыңғы қателік орын алған жерден жалғастыру керек // Егер full=true болса, барлық деректерді көшіру керек func CopyTable(fromName string, toName string, full bool) error { // ... өз кодыңыз } Егер `full=false` опциясы берілсе, бағдарлама алдыңғы қателік орын алған жерден деректерді көшіруді жалғастыруы керек. Егер `full=true` болса, барлық деректерді көшіру керек. **Базалық деңгей**: - деректерді бір ағынмен біртіндеп көшіру - ақаулардан қалпына келтіру (опция `full=false`) Қосымша ақпарат: - қажет болған жағдайда интерфейсті кеңейтуге болады, өз әдістеріңізді қосуға болады - қажет болған жағдайда **database/sql** пакетін тікелей пайдалана аласыз

211

/** Берілген жол жолы. Қайтару керек қайталанбайтын таңбалар бар i және j индекстерінің жұптарының саны (i <= j). "aba" жолы үшін жауап 5: тек ASCII емес болуы мүмкін [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") */

211

Берілген символдар жолы. Қайталанбайтын символдар бар болатын i және j индекстерінің жұптарының санын табыңыз (i <= j). "aba" жолы үшін жауап 5: [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") "abcb" жолы үшін жауап ?: aba 3 + 2 = 5 abcb 4 (a, b, c, d) + 1 (ab) + 1 (bc) + 1 (cb) + 1 (abc) = 8

209

/ * Микросервис архитектурасы бар қосымша бар. Микросервис интерфейс көмегімен абстрагировать етуге болады. Микросервис бір экземплярға қол жеткізу үшін, бұрын жүзеге асырылған BackendImpl типін қолдануға болады. Әрбір микросервис үшін бірнеше ондаған іске қосылған экземплярлар бар, олардың әрқайсысы өз мекенжайы addr бойынша қол жетімді. Бірақ, жеке экземплярлар сенімсіз: олар құлап қалуы, қол жетімсіз болуы немесе жүктемелі болуы мүмкін. Сондықтан, сіз Balancer типін жүзеге асыруыңыз керек, ол сондай-ақ Backend интерфейсін жүзеге асырады және микросервис экземплярлары арасында клиенттік жағына жүктеме теңестіруді жүзеге асырады, әр жолы ең аз жүктемелі экземплярды таңдайды. */ type Request interface{} type Response interface{} type Backend interface { Invoke(ctx context.Context, req Request) (Response, error) } var _ Backend = &BackendImpl{} // addr нақты экземплярдың ip:port-ін қамтиды func NewBackend(addr string) *BackendImpl type Balancer struct { // TODO } var _ Backend = &Balancer{} // addrs барлық балансқа салынатын экземплярлардың мекенжайларын қамтиды func NewBalancer(addrs []string) *Balancer { // TODO }

209

Архитектурада WebSocket байланысы қалай жұмыс істейді — ол қашан орнатылады және кім кіммен сөйлеседі?

209

Таралған жүйелермен жұмыс тәжірибеңіз бар ма?

209

150 миллион қолданушыны қолдайтын, 75 миллион DAU, 225 миллион MAU, 1.2M оқу / 300k жазу пик QPS, 5 миллион бір уақытта қолданушы, жылына 60 PB жаңа деректер, жыл сайын 30% өсу, SLA 99.95%, p99 <200 мс оқу үшін, <300 мс жазу үшін. КОНТЕКСТ WhatsApp-қа ұқсас таралған хабарламалар жүйесін жобалау, ол 1:1 және топтық чаттарды қолдайды, хабарламаларды жеткізу, онлайн-статусты көрсету және мультимедиялық файлдарды (суреттер, видеолар, аудио) тасымалдау. Жүйе жоғары қол жетімділікті, төмен кідірісті, жоғары параллелизмді және ғаламдық масштабтауды қамтамасыз етуі керек. ФУНКЦИОНАЛДЫ ТАЛАПТАР - Жеке (1:1) және топтық чаттарды қолдау, қатысушыларды қосу/алу мүмкіндігімен - Мәтіндік және мультимедиялық файлдарды жіберу және қабылдау Қызмет немесе клиент деңгейінде end-to-end шифрлау механизмінің нақты жүзеге асырылуы байқалмайды, жалпы аннотациядан басқа. - Шардинг және репликация туралы нақты сипаттама жоқ, chat_id немесе user_id бойынша масштабтау және ақауларды төзімділікті қамтамасыз ету үшін. - Офлайн синхрондау және жеткізу туралы нақты компонент немесе механизм жоқ. - Жүктемені теңестіру қалай жүзеге асырылатыны, әсіресе пиктік жүктемелер кезінде. **Нақты мәселелер:**

209

Топты басқару тәжірибеңіз бар ма?

208
/11