Sobes.tech

Data Analyst

// wir haben eine Methode, um Informationen über Produkte zu erhalten, diese Methode wird sehr häufig aufgerufen // gibt es Probleme in diesem Code und wie kann man sie beheben? Datenbank postgress

Principal
264

// Wir haben eine Methode, um Informationen über Produkte zu erhalten, diese Methode wird sehr häufig aufgerufen // Gibt es Probleme in diesem Code und wie kann man sie beheben? Datenbank postgress func (r *ProductRepository) GetProductDetails(ctx context.Context, productIDs []int) []Product { products := make([]Product, 0, len(productIDs)) for _, id := range productIDs { go func(id int) { var p Product query := "SELECT name, price, description FROM products WHERE id = $1" err := r.db.QueryRowContext(ctx, query, id).Scan(&p.Name, &p.Price, &p.Desc) if err != nil { r.logger.Error("error get product", "err", err) return } products = append(products, p) }(id) } return products }

Principal
163

// Beim Aktualisieren einer Bestellung müssen wir die Bestelldaten an mehrere Dienste (Drittanbieter) senden // die Anzahl der Dienste wächst (kann Tausende+ sein) // Wir haben den Code geschrieben, anfangs lief alles gut, aber mit der Zeit begann unser Dienst, viele Ressourcen zu verbrauchen // Es ist notwendig, diesen Code zu optimieren, damit er bei einer großen Anzahl von Diensten effizient arbeitet func (s *orderService) SendOrder(ctx context.Context, hosts []string, order Order) { for i := 0; i < len(hosts); i++ { go func() { // Stellen Sie sich vor, dass dies ein langer Netzwerkanruf ist response, err := s.httpClient.Send(ctx, hosts[i], order) if err != nil { s.logger.Error(ctx, "Fehler beim Senden", err) return } s.logger.Info(ctx, "Erfolg", response) }() } }

Principal
151

Ist UPDATE an sich eine Transaktion? Ist eine explizite Transaktion für ein atomares UPDATE erforderlich?

Principal
142

Was passiert, wenn man gleichzeitig tausende Verbindungen startet?

Principal
125

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 }

Principal
123

// Wir haben eine Tabelle mit einem Produkt, das einen Ansichtszähler hat // Tabelle goods: // ID | cnt_view // ----------- // 1 | 100 // Zwei Benutzer haben gleichzeitig begonnen, das Produkt mit id = 1 anzusehen // und in unserer Datenbank wurden 2 parallele Transaktionen gestartet // Was wird das Ergebnis sein? postgress 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() }

Principal
121

// Beim Aktualisieren einer Bestellung müssen wir die Bestelldaten an mehrere Dienste (Drittanbieter) senden // die Anzahl der Dienste wächst (kann Tausende+ sein) // wir haben den Code geschrieben, am Anfang lief alles gut, aber mit der Zeit begann unser Dienst, viele Ressourcen zu verbrauchen func (s *orderService) SendOrder(ctx context.Context, hosts []string, order Order) { for i := 0; i < len(hosts); i++ { go func() { // Stellen wir uns vor, dass dies ein langer Netzwerkanruf ist response, err := s.httpClient.Send(ctx, hosts[i], order) if err != nil { s.logger.Error(ctx, "Fehler beim Senden", err) return } s.logger.Info(ctx, "Erfolg", response) }() } }

Principal
97