Sobes.tech

Golang

package principal func main() { c := make(chan int, 1) pour range 3 { select { default: println(1) case <-c: println(2) case c <- 1: println(3) } } }

301

```go func fail() { panic("Échouer!") } func main() { fmt.Println("Démarrage!") var wg sync.WaitGroup wg.Add(1) go func() { defer func() { if e := recover(); e != nil { fmt.Println(e) } }() fail() wg.Done() }() wg.Wait() fmt.Println("Fin!") } ```

225

Pourquoi avez-vous choisi Elasticsearch ? Quelles étaient les autres options ? Avez-vous choisi quelque chose ou le ELK était-il déjà en place ?

211

Finalement, quelles solutions ont-ils choisies ? ClickHouse, ELK et quoi d'autre ?

188

Tu dis que tu as créé une fonctionnalité avec Elasticsearch pour la recherche rapide de transactions. Qu'est-ce que c'est, combien de transactions y a-t-il et quel en est l'avantage?

186

func fetch(ctx context.Context, u User) (string, error) { // faire quelque chose en réseau time.Sleep(time.Millisecond * 10) // simulation de retard return u.Name, nil //return "", errors.New("une erreur") } func Do(ctx context.Context, users []User) (map[string]int64, error) { var mu sync.Mutex var wg sync.WaitGroup ch := make(chan error, len(users)) names := make(map[string]int64, 0) ctxWithCancel, cancel := context.WithCancel(ctx) wg.Add(len(users)) for _, u := range users { go func() { defer wg.Done() select { case name, err := fetch(ctx, u): if err != nil { ch <- err return } mu.Lock() names[name] = names[name] + 1 mu.Unlock() case <-ctxWithCancel.Err: } }() }

182

Quel est le rapport avec les services si nous parlons de tolérance aux pannes et que nous l'avons réduit aux réplicas?

179

Y a-t-il eu des retours des utilisateurs ou du support technique après la mise en œuvre d'Elasticsearch?

171

Qu'est-ce qui rend un système à haute charge ? En se basant sur votre expertise.

168

package principal import ( "fmt" ) func main() { c := make(chan string, 1) go fmt.Println(<-c) c <- "Bonjour le monde!" fmt.Println("Sortie!") } Erreur fatale : toutes les goroutines sont endormies - blocage! goroutine 1 [réception de canal] : main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Programme terminé : statut 2.

168

package main func main() { c := make(chan int) for range 3 { select { default: println(1) case <-c: println(2) case c <- 1: println(3) } } }

159

package main import ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Hello World!" fmt.Println("Exit!") }

156

var defaultTxOptions = &sql.TxOptions{} const defaultCurrency = "RUB" func CreateUserWithDefaultCurrency(ctx context.Context, db *sql.DB, email, passwordHash string) error { tx, err := db.BeginTx(ctx, defaultTxOptions) if err != nil { return err } defer func() { if err != nil{ tx.Rollback() } }() _, err = tx.Exec("INSERT INTO users (email, password) VALUES (?, ?)", email, passwordHash) if err != nil { return err } rows, err := tx.Query("SELECT id FROM users WHERE email = ?", email) if err != nil { return err } defer rows.Close() id := 0 for rows.Next() { err = rows.Scan(&id) if err != nil { return err } } _, err = tx.Exec("INSERT INTO balances (user_id, currency, current_balance) VALUES (?, ?, 0)", id, defaultCurrency) if err != nil { return err } return tx.Commit() }

147

package principal import ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Bonjour le monde!" fmt.Println("Sortie!") } Erreur fatale : tous les goroutines sont endormis - deadlock! goroutine 1 [réception du canal] : main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Programme terminé : statut 2.

147

func Do(ctx context.Context, users []User) (map[string]int64, error) { var mu sync.Mutex var wg sync.WaitGroup ch := make(chan error, len(users)) names := make(map[string]int64, 0) ctxWithCancel, cancel := context.WithCancel(ctx) wg.Add(len(users)) for _, u := range users { go func() { defer wg.Done() select { case name, err := fetch(ctx, u): if err != nil { ch <- err return } mu.Lock() names[name] = names[name] + 1 mu.Unlock() case <-ctxWithCancel.Err: } }() } return names, nil }

139
/2