Golang
Co było buforowane? Jakieś katalogi?
/* Musimy przesłać dane z pewnego źródła do odbiorcy. Źródło dostarcza dane w małych partiach (~dziesięć rekordów), podczas gdy odbiorca działa bardziej efektywnie z większymi partiami. Przykład rzeczywisty to przesyłanie danych z kolejek typu Kafka do bazy danych Clickhouse. Źródło: - Praktycznie nieskończone. - Źródło nigdy nie zwraca więcej niż MaxItems rekordów w jednym wywołaniu Next. - W ramach jednej "sesji" (jednego wywołania funkcji Pipe), źródło zwraca nowe dane przy każdym Next. - Jednak po restarcie, źródło zacznie od poprzedniej "potwierdzonej" pozycji, wskazywanej przez cookie. Dlatego *każda* wartość cookie zwrócona przez Next, po zapisaniu danych w odbiorniku, musi być potwierdzona wywołaniem Commit, w tej samej kolejności, w jakiej zostały zwrócone przez Next. Odbiornik: - Nie może przetworzyć więcej niż MaxItems naraz. Podstawowy poziom: Wymaga zaimplementowania funkcji func Pipe(p Producer, c Consumer) error która czyta dane ze źródła, grupuje je w bufor o rozmiarze nie większym niż MaxItems i zapisuje do odbiornika, a następnie potwierdza postęp w źródle. */ const MaxItems = 9999 type Producer interface { // Next zwraca: // - pakiet elementów do przetworzenia // - cookie do potwierdzenia po zakończeniu przetwarzania // - błąd Next() (items []any, cookie int, err error) // Commit służy do oznaczenia pakietu danych jako przetworzony Commit(cookie int) error } type Consumer interface { Process(items []any) error } func Pipe(p Producer, c Consumer) error { var buf []any var cookies []int for { items, cookie, err := p.Next() if err != nil { return err } buf = append(buf, items...) cookies = append(cookies, cookie) if len(buf) >= MaxItems { if err := c.Process(buf); err != nil { return err } for _, c := range cookies { if err := p.Commit(c); err != nil { return err } } buf = buf[:0] cookies = nil } } if len(buf) > 0 { if err := c.Process(buf); err != nil { return err } for _, c := range cookies { if err := p.Commit(c); err != nil { return err } } } return nil }
Czy może wymienić firmy lub dostawców, z którymi miał do czynienia?
Opowiedz o ostatnim miejscu pracy: czym się zajmowałeś, jakiego stosu technologicznego używałeś, jakie były trudne zadania?
Czym jest slice w Go?
Czy możesz wymienić główne typy wywołań używanych w gRPC?
Czy dozwolone jest uzyskiwanie informacji z kanału z ustawionym trybem zamkniętym?
Czy można bezpośrednio zapisywać dane do określonej partycji Kafka, pomijając klucz do haszowania?
Czy możesz wyjaśnić mechanizm dodawania elementu na koniec struktury danych, na przykład listy lub tablicy?
Jakie dane i w jaki sposób są umieszczane na stosie podczas wykonywania programu?
Jakie metody buforowania preferujesz używać w swoich projektach i dlaczego?
Czym różni się widok materializowany od zwykłego widoku?
Jakie komponenty wchodzą w skład struktury listy powiązanej?
Jak określa się czas wykonania operacji dodania elementu po kluczu do struktury danych Map?
Dlaczego początkowy rozmiar stosu wątków jest zwykle ustawiany na 2 MB?
Czy kiedykolwiek używałeś struktury ErrGroup w swoich projektach do zarządzania równoległymi zadaniami?
Jakie nietypowe lub niestandardowe pakiety używałeś w swojej praktyce?
Dlaczego wzrost plasterka zwalnia i dlaczego nie można go ciągle podwajać?
W jakim miejscu wykonywane są polecenia podczas procesu pracy GitLab CI/CD?
Jakie mogą wystąpić konsekwencje braku przestrzegania zasad SOLID w projektowaniu oprogramowania?