Sobes.tech

Golang

// Podczas aktualizacji zamówienia, musimy wysłać dane zamówienia do kilku usług (zewnętrzne API) // liczba usług rośnie (może być tysiące+) // napisaliśmy kod, na początku wszystko działało dobrze, ale z czasem nasza usługa zaczęła zużywać dużo pamięci func (s *orderService) SendOrder(ctx context.Context, hosts []string, order Order) { for i := 0; i < len(hosts); i++ { go func() { // Wyobraźmy sobie, że to długi wywołanie sieciowe response, err := s.httpClient.Send(ctx, hosts[i], order) if err != nil { s.logger.Error(ctx, "nie udało się wysłać", err) return } s.logger.Info(ctx, "sukces", response) }() } }

Middle+
194

Czym są kanały w Go? Jakie są? Jak są zbudowane od środka?

192

Czym jest kontekst w Go? Czym różni się context.WithTimeout od context.WithDeadline?

191

Czym jest blokada pesymistyczna?

190

Jakie są sposoby łączenia łańcuchów w Go? Czym różni się + od strings.Builder?

189

Jak zaimplementowano buforowanie danych? Jaką politykę buforowania zastosowano?

187

Jak sprawić, aby wszystkie zdarzenia dotyczące jednego zamówienia trafiały do jednej partycji Kafka?

185

Czym są generyki w Go? Jak je rozumiesz?

185

Czym jest Dead Letter Queue (DLQ)?

184

Czym jest slice? Co jest pod maską slice? Jak działa funkcja append?

184

Co się stanie z Redisem i klientami, jeśli Redis jest pełny i polityki wypychania są wyłączone?

181

// tabela towarów: // ID | cnt_view // ----------- // 1 | 100 // dwaj użytkownicy zaczęli jednocześnie oglądać towar o id = 1 // i w naszej bazie danych uruchomiono 2 równoległe transakcje // jaki będzie wynik? 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() }

Middle+
178

Czym są Mutex i RWMutex? Czym się różnią?

175

Jak obliczono 25%? Dlaczego nie 20 ani 30?

172

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 }

Middle+
172

Jak działa zbieracz śmieci w Go? Kiedy się uruchamia? Czy można go uruchomić ręcznie?

171

Jakie narzędzia profilujące są w Go?

167

Czym są łańcuchy w Go? Co one reprezentują pod maską?

167

Czy podczas wdrażania Kafka wystąpiły niuanse i trudności? Czy to był Twój pierwszy doświadczenie z wdrażaniem?

166

Czym jest wyrównanie struktur w Go? Jak zoptymalizować pola struktury pod kątem pamięci?

164
/3