galvenais pakotne func main() { c := make(chan int, 1) per range 3 { select { noklusējums: println(1) gadījums <-c: println(2) gadījums c <- 1: println(3) } } }
Golang
```go func fail() { panic("Neveiks!") } func main() { fmt.Println("Sākums!") 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("Beigas!") } ```
Kāpēc izvēlējāties Elasticsearch? Kādas bija citas iespējas? Vai kaut ko izvēlējāties vai jau bija ELK?
Vai jums ir jautājumi par projektiem vai darba apstākļiem?
Tu saki, ka ar Elasticsearch izveidoji rīku ātrai darījumu meklēšanai. Kas tas ir, cik darījumu tur ir un kāda ir no tā peļņa?
func fetch(ctx context.Context, u User) (string, error) { // kaut kas darām tīklā time.Sleep(time.Millisecond * 10) // aizkaves imitācija return u.Name, nil //return "", errors.New("kāda kļūda") } 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: } }() }
Galu galā, no kādiem risinājumiem jūs izvēlējāties? ClickHouse, ELK un kas vēl?
Kur šobrīd strādājat?
Pēc Elasticsearch ieviešanas vai bija kādi lietotāju vai tehniskās atbalsta dienesta atsauksmes?
Kas padara sistēmu augsta slodze? Balstoties uz jūsu pieredzi.
Vai jums ir militārā karte?
No kādas summas jūs apsverat piedāvājumu?
galvenais pakotne importēt ( "fmt" ) func main() { c := make(chan string, 1) go fmt.Println(<-c) c <- "Sveika, pasaule!" fmt.Println("Išeiti!") } mirtina klaida: visos gorutinos miega - deadlock! goroutine 1 [kanāla saņemšana]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Programa beidzās: stāvoklis 2.
galvenais pakotne func main() { c := make(chan int) 3 cikli { select { noklusējuma: println(1) gadījums <-c: println(2) gadījums c <- 1: println(3) } } }
galvenais pakotne importēt ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Hello World!" fmt.Println("Iziet!") }
Kāda ir saistība ar pakalpojumiem, ja mēs runājam par kļūdu toleranci un to esam samazinājuši līdz replikām?
galvenais pakets importēt ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Sveika, pasaule!" fmt.Println("Išeiti!") } mirtina klaida: visi gorutinai miega - deadlock! goroutine 1 [kanāla saņemšana]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Programma beidzās: stāvoklis 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() }
Kur šobrīd dzīvojat?
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 }