// Kada ažurirate narudžbinu, morate poslati podatke o narudžbini na više usluga (API treće strane) // broj usluga raste (može biti hiljade+) // napisali smo kod, na početku je sve išlo dobro, ali vremenom je naša usluga počela da troši mnogo memorije func (s *orderService) SendOrder(ctx context.Context, hosts []string, order Order) { for i := 0; i < len(hosts); i++ { go func() { // Zamislimo da je ovo dug poziv mreže response, err := s.httpClient.Send(ctx, hosts[i], order) if err != nil { s.logger.Error(ctx, "neuspešno slanje", err) return } s.logger.Info(ctx, "uspešno", response) }() } }
Golang
Šta su kanali u Go? Koje postoje? Kako su strukturirani ispod haube?
Šta je context u Go? Čime se razlikuje context.WithTimeout od context.WithDeadline?
Šta je pesimistička blokada?
Koje su metode spajanja nizova u Go? Koja je razlika između + i strings.Builder?
Kako je implementirano keširanje podataka? Koja je politika keširanja korišćena?
Šta su generici u Go? Kako ih razumeš?
Kako osigurati da svi događaji za jednu narudžbu idu u jednu particiju Kafka?
Šta je Dead Letter Queue (DLQ)?
Šta je slice? Šta se nalazi ispod haube slice-a? Kako funkcioniše funkcija append?
Šta će se desiti sa Redisom i klijentima ako je Redis pun i politike istisnjenja su isključene?
// таблица с товарами: // ID | cnt_view // ----------- // 1 | 100 // два пользователя начали одновременно просматривать товар с id = 1 // и в нашей базе данных запущены 2 параллельные транзакции // какой будет результат? postgresql func IncrementView(ctx context.Context, db *sql.DB, id int64) error { tx, err := db.BeginTx(ctx, nil) if err != nil { return err } defer tx.Rollback() var cnt int err = tx.QueryRowContext(ctx, "SELECT cnt_view FROM goods WHERE id = $1", id, ).Scan(&cnt) if err != nil { return err } cnt++ _, err = tx.ExecContext(ctx, "UPDATE goods SET cnt_view = $1 WHERE id = $2", cnt, id, ) if err != nil { return err } return tx.Commit() }
Šta su Mutex i RWMutex? Čime se razlikuju?
Kako je izračunat broj od 25%? Zašto ne 20 ili 30?
Kako radi sakupljač smeća u Go? Kada se pokreće? Može li se pokrenuti ručno?
func (r *OrderRepository) GetActiveOrderIDs(ctx context.Context, offset, limit int) ([]uint32, error) { var ( res []uint32 args []interface{} ) query := `SELECT id FROM "order" WHERE is_terminated = false LIMIT $1 OFFSET $2;` args = append(args, limit, offset) rows, err := r.slave.Query(ctx, query, args...) if err != nil { return nil, err } for rows.Next() { var orderID uint32 if err = rows.Scan(&orderID); err != nil { return nil, err } res = append(res, orderID) } return res, nil }
Koji alati za profilisanje postoje u Go?
Šta su nizovi u Go? Šta predstavljaju ispod haube?
Da li su postojale nijanse i poteškoće prilikom implementacije Kafka? Da li je ovo bilo vaše prvo iskustvo sa implementacijom?
Kako locirati problem sa timeout-om u distribuiranom sistemu? Gde gledati?