Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Shutdown workers

Avatar for taxio taxio
April 20, 2019

Shutdown workers

Avatar for taxio

taxio

April 20, 2019
Tweet

More Decks by taxio

Other Decks in Technology

Transcript

  1. 4JHOBM8BUDIFS w 4*(*/5ͱ4*(5&3.Λ؂ࢹ Ὂ ड৴ͨ͠Β"1*4FSWFSʹ౉ͨ͠DPOUFYU ͷcancel()Λ࣮ߦ w sigStopCh Ὂ શମͷॲཧ͕ऴ͔ྃͨ͠Ͳ͏͔ΛݟΔ

    ▷ ࿈ଓͰγάφϧ͕དྷͯ΋େৎ෉ • golang.org/x/sync/errgroup Ὂ HPSPVUJOFͷ؅ཧ͕͠΍͍͢Α͏ʹ !8 eg, ctx := errgroup.WithContext(context.Background()) srvCtx, srvCancel := context.WithCancel(ctx) sigCh := make(chan os.Signal) sigStopCh := make(chan struct{}) signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM) eg.Go(func() error { defer close(sigCh) for { select { case <-sigStopCh: log.Println("finish signal watching") return nil case sig := <-sigCh: log.Printf("received signal %+v\n", sig) srvCancel() } } })
  2. "1*4FSWFS w BQJEVNQ͕ୟ͔ΕΔͱɼ
 DumpIds DIBOOFM ʹσʔλΛ٧ΊΔ Ὂ CMPDL͕ൃੜ͢ΔͷͰຊ౰͸ྑ͘ͳ͍ w γάφϧʹΑͬͯDUY͕Ωϟϯηϧ͞ΕͨΒɼ

    Shutdown()ΛݺͿ Ὂ ͍͍ײ͡ʹ(SBDFGVM4IVUEPXOͯ͘͠ΕΔʁ Ὂ ໌ࣔతʹClose()͠ͳ͍ͱ௨৴தͷॲཧ͸
 λΠϜΞ΢τͯ͘͠Εͳ͍ʁ w %VNQͷDUYΛΩϟϯηϧ͠ɼ
 DIBOOFMΛด͡Δ !9 func (s *APIServer) Run(...) ... { ... go func() { log.Println("start server") err := srv.ListenAndServe() if err != nil { log.Print(err) } }() defer close(s.DumpIds) defer cancelDump() <-ctx.Done() ctxShutdown, _ := context.WithTimeout(...) if err := srv.Shutdown(ctxShutdown); err != nil { log.Print(err) } log.Println("shutdown server!!") ... }
  3. %VNQ8PSLFS w DIBOOFM dumpIds ʹ٧·͍ͬͯΔ
 σʔλΛҰ୴ୀආ͍ͤͨ͞৔߹͸ɼ
 ctxͷDone()ΛݟͯϋϯυϦϯά͢Δ Ὂ dompIds͸DMPTF͞ΕͯΔͷͰɼೖͬͯΔ σʔλΛॲཧ͖͠Ε͹GPS͸ൈ͚Δ

    w ࠷ޙʹ/PUJpDBUJPO8PSLFSͷDUYΛ Ωϟϯηϧ͠ɼDIBOOFMΛด͡Δ !10 eg.Go(func() error { defer close(notificationMsgs) defer notificationCancel() defer log.Println("shutdown dump worker") for d := range dumpIds { select { case <-dumpCtx.Done(): // TODO: save dump ids return nil default: time.Sleep(5 * time.Second) log.Printf("dump: %#v\n", d) notificationMsgs <- dumpData(d) } } return nil })
  4. /PUJpDBUJPO8PSLFS w %VNQ8PSLFSͱಉ͡ !11 eg.Go(func() error { defer log.Println("shutdown notification

    worker") defer close(sigStopCh) for msg := range notificationMsgs { select { case <-notificationCtx.Done(): // TODO: save messages return nil default: time.Sleep(4 * time.Second) sendNotification(msg) log.Printf("notification message: %s\n", msg) } } return nil })