Czy zdecydowałeś się napisać WaitGroup, ponieważ pojawił się kanał, czy dlatego, że zdecydowałeś się napisać goroutines do czegoś?
Golang
Co mówi konwencja Go na temat używania WaitGroup i typów zwracanych (przyjmując interfejsy, zwracając konkretne typy)?
// Klient przekazuje obiekt (Task) z danymi do wykonania zadania, // w naszym przykładzie użyjemy pustej struktury. // // Menedżer może obsługiwać nie więcej niż N zadań jednocześnie, // i nie więcej niż X zadań może być w kolejce. // Jeśli nie ma miejsca w kolejce, od razu zwracamy klientowi błąd. // // Zadanie jest pobierane do przetwarzania, jeśli dostępni są wolni obsługujący. // Symulujemy czas trwania przetwarzania za pomocą time.Sleep(5*time.Second). // Gdy jedno zadanie się zakończy, pobieramy następne z kolejki. // Jeśli kolejka jest pusta, oczekujemy na nowe zadania od klientów. // // Z gwiazdką: rozbudować strukturę Task i uzyskać statusy zadań przez osobne zapytanie. package scheduler type Scheduler interface { AddTask(t Task) error Close() } type scheduler struct { queue chan Task wg sync.WaitGroup } func New(workers, queue int) Scheduler { // implementacja w oczekiwaniu } type Task interface { Do() }
Jakie typy indeksów w PostgreSQL, oprócz B-tree, używałeś?
Jak moglibyśmy obsługiwać zewnętrznie błędy, które występują w zadaniach, jeśli chcielibyśmy to zrobić?
Jaką technologię/narzędzie używasz?
Czy używałeś CTE? Opowiedz, czym to jest.
Jaka była Twoja rola w podejmowaniu decyzji architektonicznych podczas rozwoju usługi wyszukiwania?
Czy używałeś kontekstów w praktyce? Opowiedz.
Czy można utworzyć indeks tylko na repliki, ale nie na masterze?
Czy w implementacji są jeszcze wyścigi danych? Szczególnie w metodzie Keys, która zwraca fragment kluczy?
func New(workers, queue, int) Scheduler { s := &scheduler { queue := make(chan Task, queue) for i := 0; i < workers; i++ { wg.Add(1) go func() { defer wg.Done() for task := range s.queue { task.Do() } }() } } return s } func (s *scheduler) Close() { close(s.queue) s.wg.Wait() } type Task interface { Do() }
Chcesz napisać klasyczny pool workerów?
Czym różni się SELECT FOR UPDATE od SELECT FOR SHARE?
Czy używałeś funkcji okienkowych?
Czy masz doświadczenie w pisaniu operatorów Kubernetes, administrowaniu operatorami, Helm Chart?
Rodzaje replikacji w PostgreSQL
Dlaczego nie użyliście Redis zamiast przechowywania w bazie?
Jakie dokumenty były przechowywane w ELK?
Optymistyczne i pesymistyczne blokady — opowiedz