Қазіргі табыс деңгейіңізді айта аласыз ба?
Golang
Қазіргі уақытта Мәскеуде тұрасыз ба? Қандай қалаға қарайсыз? Гибридті жұмыс форматын қарастырасыз ба? Жұмыс іздеу қай кезеңінде тұрсыз?
Басқа белсенді сұхбаттасу процестеріңіз бар ма?
Бұл метрикалар қалай біріктіріліп, Grafana-да көрсетіледі?
Масштабталатын мессенджерді жобалау, 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 архитектурасы көрсетілген)
Сіз қандай операциялар саны бойынша секундқа көрсеткішке жеттіңіз немесе талдадыңыз?
Соңғы рет жұмыс істеген командаңыздың құрамы қандай болды?
Сізде белсенді GitHub немесе LinkedIn бар ма?
Алдыңғы жұмыс орындарында не істегеніңізді, қандай функцияларды жүзеге асырғаныңызды қысқаша айта аласыз ба?
Командада тестілер қалай ұйымдастырылған — кім не жазады, қандай қамту, E2E бар ма?
/ * Бізге деректерді бір көзден алатын және оны тұтынушыға жеткізетін жүйе керек. Бұл кезде көз шағын топтамалармен (~онша жазбалар), ал тұтынушы үлкен батчтармен (~мыңдаған жазбалар) жұмыс істеуге тиімді. Шынайы мысал — Kafka сияқты кезектерден деректерді Clickhouse базасына жеткізу. Көз: - Шартты түрде шексіз. - Көз әр шақырғанда MaxItems-тан көп емес жазбаны қайтармайды. - Бір "сессия" (бір Pipe функциясының шақырылуы) ішінде көз әр шақырғанда жаңа деректер қайтарылады. - Алайда, қайта іске қосқанда көз өткен "расталған" позициядан бастайды, ол cookie арқылы анықталады. Сондықтан, Next шақырған кезде қайтарылған әрбір cookie мәні, деректер қабылдағышқа сақталғаннан кейін, Commit шақыруымен нақты белгіленуі керек, және оларды Next қайтарған тәртіпте ғана орындау керек. Қабылдағыш: - MaxItems-тан көп емес деректерді бір рет өңдей алады. Негізгі деңгей: func Pipe(p Producer, c Consumer) error функциясын жүзеге асыру керек, ол көзден деректерді оқиды, оларды MaxItems-ке дейінгі буферге топтайды және қабылдағышқа сақтайды, сонан соң көздегі прогресті белгілейді. Қиындату: Next, Process және Commit әдістері желілік шақырулармен байланысты және ұзақ уақыт жұмыс істей алады. Деректерді тасымалдау процесін жеделдету үшін оқуды, жазуды және прогресті растауды параллель жүргізу керек. Мысалы, Process немесе Commit шақырылған кезде, көзден оқуды және жаңа буфер құруды жалғастыру керек. * /
Map деректер құрылымында элементтерді іздеудің тиімділігін арттыру үшін қандай әдістер қолдануға болады?
/* Екі 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** пакетін тікелей пайдалана аласыз
/** Берілген жол жолы. Қайтару керек қайталанбайтын таңбалар бар i және j индекстерінің жұптарының саны (i <= j). "aba" жолы үшін жауап 5: тек ASCII емес болуы мүмкін [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") */
Берілген символдар жолы. Қайталанбайтын символдар бар болатын 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
/ * Микросервис архитектурасы бар қосымша бар. Микросервис интерфейс көмегімен абстрагировать етуге болады. Микросервис бір экземплярға қол жеткізу үшін, бұрын жүзеге асырылған 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 }
Архитектурада WebSocket байланысы қалай жұмыс істейді — ол қашан орнатылады және кім кіммен сөйлеседі?
Таралған жүйелермен жұмыс тәжірибеңіз бар ма?
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 бойынша масштабтау және ақауларды төзімділікті қамтамасыз ету үшін. - Офлайн синхрондау және жеткізу туралы нақты компонент немесе механизм жоқ. - Жүктемені теңестіру қалай жүзеге асырылатыны, әсіресе пиктік жүктемелер кезінде. **Нақты мәселелер:**
Топты басқару тәжірибеңіз бар ма?