Sobes.tech

Data Analyst

// ունենք մեթոդ՝ ստանալու տեղեկություններ ապրանքների մասին, այս մեթոդը շատ հաճախ է կանչվում // արդյոք այս կոդում խնդիրներ կան և ինչպես դրանք ուղղել? postgress տվյալների բազա

Principal
274

// Մեր մոտ կա մեթոդ ապրանքների մասին տեղեկություններ ստանալու համար, այս մեթոդը շատ հաճախ է կանչվում // կա՞ խնդիրներ այս կոդում և ինչպես կարելի է դրանք ուղղել: 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
172

// Զբաղվելով պատվերի թարմացմամբ, մենք պետք է ուղարկենք պատվերի տվյալները մի քանի ծառայությունների (երրորդ կողմերի) // ծառայությունների թիվը աճում է (կարող է լինել հազար+) // մենք գրել ենք կոդը, սկզբում ամեն ինչ լավ էր, բայց ժամանակի ընթացքում մեր ծառայությունը սկսեց շատ ռեսուրսներ սպառել // Այս կոդը պետք է օպտիմալացվի, որպեսզի արդյունավետ աշխատի մեծ թվով ծառայությունների դեպքում func (s *orderService) SendOrder(ctx context.Context, hosts []string, order Order) { for i := 0; i < len(hosts); i++ { go func() { // Կարծում ենք, որ սա երկար ցանցային կանչ է response, err := s.httpClient.Send(ctx, hosts[i], order) if err != nil { s.logger.Error(ctx, "չի հաջողվել ուղարկել", err) return } s.logger.Info(ctx, "հաջողություն", response) }() } }

Principal
158

Արդյո՞ք UPDATE-ը ինքնին գործարք է: Պետք է արդյոք բացահայտ գործարք մեկ ագրեգատային UPDATE-ի համար:

Principal
153

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
130

// Մեր տաբլոքում կա ապրանք, որի դիտումների հաշվիչն է // goods տաբլո: // ID | cnt_view // ----------- // 1 | 100 // Երկու օգտվող միաժամանակ սկսել է դիտել ապրանքը, որի id-ն = 1 // և մեր բազայում միաժամանակ գործարկվել են 2 պառալել տրանզակցիաներ // Ինչ կլինի արդյունքը? 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
127

Ի՞նչ կլինի, եթե միաժամանակ սկսենք հազարավոր կապեր։

Principal
127

// Երբ պատվերը թարմացվում է, մենք պետք է ուղարկենք պատվերի տվյալները մի քանի ծառայությունների (երրորդ կողմերի) // ծառայությունների թիվը աճում է (կարող է լինել հազարավոր+) // մենք գրել ենք կոդը, սկզբում ամեն ինչ լավ էր, բայց ժամանակի ընթացքում մեր ծառայությունը սկսեց շատ ռեսուրսներ սպառել func (s *orderService) SendOrder(ctx context.Context, hosts []string, order Order) { for i := 0; i < len(hosts); i++ { go func() { // Ենթադրենք, սա երկար ցանցային կանչ է response, err := s.httpClient.Send(ctx, hosts[i], order) if err != nil { s.logger.Error(ctx, "չհաջողվեց ուղարկել", err) return } s.logger.Info(ctx, "հաջողություն", response) }() } }

Principal
104