Co je to idempotence?
Golang
Co jsou to kanály v Go? Jaké existují? Jak jsou strukturovány pod kapotou?
// Při aktualizaci objednávky musíme odeslat údaje o objednávce na několik služeb (API třetích stran) // počet služeb roste (může být tisíce+) // napsali jsme kód, zpočátku vše fungovalo dobře, ale časem naše služba začala spotřebovávat hodně paměti func (s *orderService) SendOrder(ctx context.Context, hosts []string, order Order) { for i := 0; i < len(hosts); i++ { go func() { // Představme si, že je to dlouhý síťový volání response, err := s.httpClient.Send(ctx, hosts[i], order) if err != nil { s.logger.Error(ctx, "nepodařilo se odeslat", err) return } s.logger.Info(ctx, "úspěch", response) }() } }
Co je to context v Go? Čím se liší context.WithTimeout od context.WithDeadline?
Jaké jsou způsoby spojování řetězců v Go? V čem je rozdíl mezi + a strings.Builder?
Co je to pesimistické blokování?
Jak zajistit, aby všechny události jednoho objednávky šly do jedné partition Kafka?
Co se stane s Redisem a klienty, pokud je Redis plný a politiky vyřazení jsou vypnuté?
Jak bylo implementováno ukládání dat do mezipaměti? Jaká politika mezipaměti byla použita?
Co je Dead Letter Queue (DLQ)?
Co je to slice? Co je pod kapotou slice? Jak funguje funkce append?
// tabulka zboží: // ID | cnt_view // ----------- // 1 | 100 // dva uživatelé začali současně sledovat zboží s id = 1 // a v naší databázi byly spuštěny 2 paralelní transakce // jaký bude výsledek? 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() }
Jak bylo vypočítáno číslo 25 %? Proč ne 20 nebo 30?
Co je to Mutex a RWMutex? Čím se liší?
Jak funguje sběrač odpadu v Go? Kdy se spouští? Lze ho spustit ručně?
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 }
Co jsou řetězce v Go? Co představují pod kapotou?
Jaké nástroje pro profilování jsou v Go?
Byly při zavádění Kafka nějaké nuance a potíže? Byla to vaše první zkušenost s implementací?
Co je to zarovnání struktur v Go? Jak optimalizovat pole struktur v paměti?