Sobes.tech

/* Екі 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** пакетін тікелей пайдалана аласыз

213

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

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

Тәуелділіктердің инверсия принципінің негізін түсіндіріңіз және неге пайдалану жағдайында репозиторий әдістерін тікелей шақыру SOLID принципін бұзады.

212

Сіз сұраулардың орындалуын тексеру және дұрыстығын растау үшін қалай тестілеу жүргіздіңіз?

Junior — Middle
211

JWT өзінің түпнұсқалығын қалай тексереді? Токеннің жалған еместігі қалай қамтамасыз етіледі?

210

/ * Микросервис архитектурасы бар қосымша бар. Микросервис интерфейс көмегімен абстрагировать етуге болады. Микросервис бір экземплярға қол жеткізу үшін, бұрын жүзеге асырылған 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

local, dev, stage, және prod орталарындағы айырмашылықтар қандай?

209

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

208

Терезе жарамды болған кезде жауапқа не қосылады?

207

/ * Микросервисті архитектурасы бар қосымшасы бар. Микросервисті интерфейс көмегімен абстрагироватьға болады Backend. Бір микросервистің бір экземпляріне қол жеткізу үшін, ол бұрын жүзеге асырылған BackendImpl түрін қолдануға болады. Әр микросервистің бірнеше он шақты іске қосылған экземпляры бар, олардың әрқайсысы өз мекенжайы addr арқылы қол жетімді. Алайда, жеке микросервистің экземплярлары сенімсіз: олар құлап қалуы, қол жетімсіз болуы немесе шамадан тыс жүктелуі мүмкін. Сондықтан, сіз Balancer типін жүзеге асыруыңыз керек, ол да Backend интерфейсін жүзеге асырады және микросервис экземплярлары арасында клиенттік жүктеме теңгерімін жүзеге асырады, әр жолы ең аз жүктелген экземплярды таңдай отырып. */

206

Параллель сұрауларды шектеу үшін семафор мен буферленген арна қандай шектеуге ие?

206

Дерекқорлар туралы айтыңыз — не жұмыс істедіңіз және қазір не жұмыс істеп жатырсыз?

206

Ең жоғары жүктемелі қызмет ең көп өңдеген сұраулар саны (RPS) қандай?

204

Қашықтан, кеңседе немесе гибридтік жұмыс форматы?

203

JWT токені дегеніміз не? Ол қандай құрамда тұрады?

203

Картадағы элементтерді қалай салыстыруға болады? Екі карта сәйкес келетінін қалай тексеруге болады?

203

Барлық бірегей таңбалары бар ішкі жолдарды санау алгоритмін сипаттаңыз.

202

Go тілінде тапсырма жазу — практикалық бөлім (әзірлеушінің өмірінен тапсырмалар, алгоритмдерсіз): сервисді жетілдіру немесе түзету. Ұзақтығы — 1,5 сағат.

202
/11