Sobes.tech

Data Analyst

// tenemos un método para obtener información sobre los productos, este método se llama muy a menudo // ¿hay problemas en este código y cómo corregirlos? base de datos postgress

Principal
267

// Tenemos un método para obtener información sobre los productos, este método se llama muy a menudo // ¿Hay problemas en este código y cómo corregirlos? base de datos 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
165

// Al actualizar un pedido, debemos enviar los datos del pedido a varios servicios (de terceros) // el número de servicios está creciendo (puede ser miles+) // escribimos el código, al principio todo funcionaba bien, pero con el tiempo nuestro servicio empezó a consumir muchos recursos // Necesitamos optimizar este código para que funcione eficientemente con un gran número de servicios func (s *orderService) SendOrder(ctx context.Context, hosts []string, order Order) { for i := 0; i < len(hosts); i++ { go func() { // Imaginemos que esto es una llamada de red larga response, err := s.httpClient.Send(ctx, hosts[i], order) if err != nil { s.logger.Error(ctx, "falló al enviar", err) return } s.logger.Info(ctx, "éxito", response) }() } }

Principal
152

¿Es UPDATE en sí mismo una transacción? ¿Se necesita una transacción explícita para un UPDATE atómico?

Principal
146

¿Qué pasará si se inician miles de conexiones al mismo tiempo?

Principal
125

// Tenemos una tabla con un producto que tiene un contador de vistas // tabla goods: // ID | cnt_view // ----------- // 1 | 100 // Dos usuarios comenzaron a ver el producto con id = 1 al mismo tiempo // y en nuestra base de datos se lanzaron 2 transacciones en paralelo // ¿Cuál será el resultado? 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
124

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
124

// Al actualizar un pedido, debemos enviar los datos del pedido a varios servicios (de terceros) // el número de servicios está creciendo (puede ser miles+) // escribimos el código, al principio todo iba bien, pero con el tiempo nuestro servicio comenzó a consumir muchos recursos func (s *orderService) SendOrder(ctx context.Context, hosts []string, order Order) { for i := 0; i < len(hosts); i++ { go func() { // Imaginemos que esto es una llamada de red larga response, err := s.httpClient.Send(ctx, hosts[i], order) if err != nil { s.logger.Error(ctx, "falló al enviar", err) return } s.logger.Info(ctx, "éxito", response) }() } }

Principal
103