pachet principal func main() { c := make(chan int, 1) pentru range 3 { select { implicit: println(1) caz <-c: println(2) caz c <- 1: println(3) } } }
Golang
```go func fail() { panic("Eșec!") } func main() { fmt.Println("Start!") 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("Finish!") } ```
De ce ați ales Elasticsearch? Care au fost opțiunile? Ați ales ceva sau ELK era deja existent?
Aveți întrebări despre proiecte sau condițiile de lucru?
Ce au de-a face serviciile dacă vorbim despre toleranța la defecte și am redus totul la replici?
În final, din ce soluții ați ales? ClickHouse, ELK și cealaltă?
Spui că ai creat cu Elasticsearch un instrument pentru căutarea rapidă a tranzacțiilor. Ce este, câte tranzacții sunt și ce beneficii aduce?
pachet principal import ( "fmt" ) func main() { c := make(chan string, 1) go fmt.Println(<-c) c <- "Salut Lume!" fmt.Println("Ieșire!") } eroare fatală: toate goroutine-urile sunt adormite - blocaj! goroutine 1 [primire canal]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Programul a ieșit: status 2.
func fetch(ctx context.Context, u User) (string, error) { // facem ceva în rețea time.Sleep(time.Millisecond * 10) // simulare de întârziere return u.Name, nil //return "", errors.New("uneo eroare") } 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: } }() }
A existat vreun feedback de la utilizatori sau de la serviciul de suport tehnic după implementarea Elasticsearch?
Unde lucrați în prezent?
Ce face ca un sistem să fie de înaltă încărcare? Bazându-se pe experiența dumneavoastră.
Unde locuiești acum?
Aveți un carnet militar?
pachet principal func main() { c := make(chan int) pentru interval 3 { select { implicit: println(1) caz <-c: println(2) caz c <- 1: println(3) } } }
package main import ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Hello World!" fmt.Println("Exit!") }
De la ce sumă luați în considerare oferta?
pachet principal import ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Salut lume!" fmt.Println("Ieșire!") } eroare fatală: toate goroutine-urile sunt adormite - deadlock! goroutine 1 [primire canal]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Programul a ieșit: status 2.
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() }
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 }