Jak jsou zpracovávány zprávy odeslané uživatelům v režimu offline?
Golang
Jak zkontrolovat, že okno obsahuje všechny potřebné znaky?
Použili jste veřejné cloudové služby? Pokud ano, které poskytovatele a služby?
Povězte nám o svých posledních projektech a použitých technologiích.
/* Musíme přenést data z nějakého zdroje k nějakému příjemci. Zdroj vrací data v malých dávkách (~deset záznamů), zatímco příjemce pracuje efektivněji s většími dávkami (~tisíc záznamů). Reálný příklad je přenos dat z front typu Kafka do databáze Clickhouse. Zdroj: - Téměř nekonečný. - Zdroj nikdy nevrátí více než MaxItems záznamů v jednom volání Next. - V rámci jedné "seance" (jedno volání funkce Pipe) zdroj při každém volání Next vrací nová data. - Nicméně, po restartu začne zdroj od předchozí "potvrzené" pozice, určené cookie. Proto *každá* hodnota cookie, kterou Next vrátí, po uložení dat do příjemce, musí být potvrzena voláním Commit, ve stejném pořadí, v jakém byla vrácena Next. Příjemce: - Nemůže zpracovat více než MaxItems najednou. Je třeba implementovat funkci func Pipe(p Producer, c Consumer) error, která čte data ze zdroje, seskupuje je do bufferu o velikosti nejvýše MaxItems a ukládá je do příjemce, po čemž potvrzuje pokrok ve zdroji. */ const MaxItems = 9999 type Producer interface { // Next vrací: // - dávku položek k zpracování // - cookie k potvrzení po dokončení zpracování // - chybu Next() (items []any, cookie int, err error) // Commit slouží k označení dávky dat jako zpracované Commit(cookie int) error } type Consumer interface { Process(items []any) error } func Pipe(p Producer, c Consumer) error { // TODO }
4 - rychle přijímat příchozí úkoly, 5 - vrátit výsledek úkolu na požádání 6 - pokud není výsledek, vrátit odpovídající stav /* Procesor - služba, která provádí dlouhou, náročnou operaci. Je již implementována Chyby, které vrací, jsou výhradně spojeny s nesprávnými vstupními údaji, jsou stabilní a opětovné požádání je zbytečné */ type Processor interface { Process([]byte) ([]byte, error) } /* Předpokládáme, že máme generátor unikátních identifikátorů (například UUID). Generátor zaručuje, že nedojde ke kolizím */ type ID string // func NewID() ID /* Plánovač přijímá úkoly od klientů, zařadí je do fronty a spustí je ke zpracování. Zajišťuje, že současně běží nejvýše 'threads' metod zpracování Umožňuje zkontrolovat stav úkolu a získat výsledek neblokuje své veřejné metody pro zpracování */ type Scheduler struct { processor Processor } func NewScheduler( prc Processor, threads int, ) *Scheduler { // inicializační logika return &Scheduler{ processor: prc, } } func (s *Scheduler) Queue(request []byte) ID { // implementace return "" }
Popište algoritmus řešení úlohy maxSegment
Řekni mi, co se na konci děje — jak shromažďujeme vyrovnávací paměť?
Jaké jsou vaše očekávání ohledně platu?
Máte zkušenosti s psaním programů s vícenásobným vlákněním nebo asynchronními operacemi?
Jaké anti-vzory v architektuře mikroservisů znáte?
Uvažujme příklad: first=[1,1,2], second=[1,2]. Co by měl váš algoritmus vrátit a funguje správně s duplicitami?
Pokud vám nabídnou práci a vy ji přijmete, jak brzy budete připraveni začít pracovat?
Vyvažovač musí pochopit, že backend odpovídá chybami, a při překročení prahu na určitou dobu jej vyloučit z vyvažování (Circuit Breaker)
[jméno] se zeptal: při zachování pozice prvku menšího než X, jaká bude pozice?
Zabýval jste se vedoucími úkoly po celou dobu své práce?
S jakými databázemi nebo jinými úložišti dat jste pracoval? Kolik požadavků za sekundu (RPS) na zápis a čtení?
Máte zkušenosti s vývojem a podporou distribuovaných systémů?
Je správné, že momentálně bydlíte v [město] a bylo by vám pohodlné pracovat v hybridním formátu s docházkou do kanceláře?
Jaké je maximální zatížení v požadavcích za sekundu, které zvládla nejvíce zatížená služba? Je správné, že je to až 5–8 tisíc požadavků za sekundu?