Slide 1

Slide 1 text

ଳҬ੍ݶͱ x/time/rate ΈΜGoϦϦύˏVOYAGE ajito

Slide 2

Slide 2 text

౻ݪ ढ़Ұ࿠ @fujiwara github.com/fujiwara sfujiwara.hatenablog.com ٕज़෦

Slide 3

Slide 3 text

3ষΛࣥච͠·ͨ͠ ײ૝Λblog౳Ͱ͍͚ͨͩΔͱ େมتͼ·͢!

Slide 4

Slide 4 text

ಛूΛࣥච͠·ͨ͠ ײ૝Λ(ུ

Slide 5

Slide 5 text

GoͰଳҬ੍ݶ͕͍ͨ͠ • Ϧιʔε࢖͍͗͢๷ࢭ • StretcherͰμ΢ϯϩʔυଳҬ੍ݶ • ϕϯνϚʔΫ • Fluentd in_tail ϕϯνϚʔΫͷͨΊͷ go-dummer • (ࣾ಺)ISUCON ϕϯνϚʔΧʔͰଳҬΤϛϡϨʔγϣϯ • io.Reader, io.Writer ΠϯλʔϑΣʔεͩͱศར

Slide 6

Slide 6 text

ͭ͘Γ·ͨ͠ (4݄) github.com/fujiwara/shapeio import "github.com/fujiwara/shapeio" r := shapeio.NewReader(reader) // io.Reader r.SetRateLimit(1024 * 10) // 10KB/sec // ͋ͱ͸ී௨ʹ io.Reader ͱͯ͠࢖͏ Writer΋͋Γ·͢

Slide 7

Slide 7 text

ͦͷޙ

Slide 8

Slide 8 text

golang.org/x/time/rate !? ʮgolang.org/x/time/rateͰ଎౓੍ݶΛߦ͏ʯ http://qiita.com/lufia/items/29bf1aeb0a0fe69d16f0 ศརͦ͏

Slide 9

Slide 9 text

x/time/rate Ͱॻ͖௚͠ before (ଳҬ੍ޚͰ଴ͭ෦෼) func (l *limiter) wait(n int, err error) (int, error) { if n == 0 || err != nil { return n, err } elapsed := time.Since(l.startedAt) l.bytes += int64(n) rate := float64(l.bytes) / elapsed.Seconds() if rate < l.bytesPerSec { return n, nil } d := time.Duration(float64(l.bytes)/l.bytesPerSec*float64(time.Second) - float64(elapsed)) time.Sleep(d) // reset shaping window l.startedAt = time.Now() l.bytes = 0 return n, nil }

Slide 10

Slide 10 text

x/time/rate Ͱॻ͖௚͠ after func (s *Writer) Write(p []byte) (int, error) { if s.limiter == nil { return s.w.Write(p) } n, err := s.w.Write(p) if err != nil { return n, err } // ଴ͭͱ͜Ζ͸͚ͩ͜͜ if err := s.limiter.WaitN(s.ctx, n); err != nil { return n, err } return n, err }

Slide 11

Slide 11 text

x/time/rate 1ඵؒʹཷ·Δtokenͷ਺ͱɺ࠷େͰཷΊΔ਺Λࢦఆ limiter := rate.NewLimiter(rate.Limit(m), burst) nݸͷtokenΛফඅ͢Δ(ཷ·ͬͯͳ͚Ε͹ཷ·Δ·Ͱ଴ͭ) err := limiter.WaitN(ctx, n) nݸͷtoken͕ཷ·ͬͯΔ͔֬ೝ(ཷ·ͬͯΕ͹ফඅͯ͠true) ok := limiter.AllowN(time.Now(), n)

Slide 12

Slide 12 text

x/time/rate ಋೖͷ෭࢈෺ context ͕࢖͑ΔΑ͏ʹ ctx, cancel := context.WithTimeout(context.Background(), 3*time.Seconds) r := shapeio.NewReaderWithContext(reader, ctx) shapeio.SetRateLimit(1024 * 1024) io.Copy(w, r) ... ଳҬ੍ݶͭͭ͠λΠϜΞ΢τ΍Ωϟϯηϧ΋

Slide 13

Slide 13 text

·ͱΊ x/time/rate ศརʂ shapeio ΋ΑΖ͘͠