Čo je GOMAXPROCS? Čo sa stane, ak nastavíte veľmi veľké číslo?
Golang
Čo sú to kanály v Go? Aké existujú? Ako sú štruktúrované pod kapotou?
// Pri aktualizácii objednávky musíme odoslať údaje o objednávke na niekoľko služieb (API tretích strán) // počet služieb rastie (môže byť tisíce+) // napísali sme kód, na začiatku všetko fungovalo dobre, ale časom naša služba začala spotrebovávať veľa pamäte func (s *orderService) SendOrder(ctx context.Context, hosts []string, order Order) { for i := 0; i < len(hosts); i++ { go func() { // Predstavme si, že je to dlhé sieťové volanie response, err := s.httpClient.Send(ctx, hosts[i], order) if err != nil { s.logger.Error(ctx, "neúspešné odoslanie", err) return } s.logger.Info(ctx, "úspešné", response) }() } }
Čo je to pesimistické blokovanie?
Aké spôsoby existujú na spojenie reťazcov v Go? Aký je rozdiel medzi + a strings.Builder?
Čo je to context v Go? Čím sa líši context.WithTimeout od context.WithDeadline?
Čo sa stane s Redisom a klientmi, ak je Redis plný a politiky vyraďovania sú vypnuté?
Ako bolo implementované cacheovanie dát? Aká politika cacheovania bola použitá?
Ako zabezpečiť, aby všetky udalosti jednej objednávky išli do jednej partície Kafka?
Čo je Dead Letter Queue (DLQ)?
Čo je to slice? Čo je pod kapotou slice-a? Ako funguje funkcia append?
// tabuľka tovarov: // ID | cnt_view // ----------- // 1 | 100 // dvaja používatelia začali súčasne sledovať tovar s id = 1 // a v našej databáze boli spustené 2 paralelné transakcie // aký bude výsledok? 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() }
Ako bola vypočítaná hodnota 25 %? Prečo nie 20 alebo 30?
Čo je Mutex a RWMutex? Čím sa líšia?
Ako deluje zberač smeti v Go? Kdaj se zažene? Ali ga je mogoče zagnati roč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 }
Čo sú reťazce v Go? Čo predstavujú pod kapotou?
Aké nástroje na profilovanie sú v Go?
Čo je zarovnanie štruktúr v Go? Ako optimalizovať polia štruktúr v pamäti?
Boli pri uvádzaní Kafka nejaké nuansy a ťažkosti? Bola to vaša prvá skúsenosť s implementáciou?