go 1.8 net/http timeouts

13
GO1.8 NET/HTTP TIMEOUTS 2017-03-25 Tetsuya Morimoto

Transcript of go 1.8 net/http timeouts

Page 1: go 1.8 net/http timeouts

GO1.8 NET/HTTP TIMEOUTS

2017-03-25 Tetsuya Morimoto

Page 2: go 1.8 net/http timeouts

ABOUT ME

Tetsuya Morimoto

twitter: @t2y

I like Python, Java and Go!

Yahoo Japan Corporation

Data & Science Solutions Group

Apprentice Infrastructure engineer

Mission: OPS → SRE

Page 4: go 1.8 net/http timeouts

GO 1.8 FEATURE

Page 5: go 1.8 net/http timeouts

MINOR CHANGES

Go 1.8 net/http changes from release note

“ The Server adds configuration options ReadHeaderTimeout and IdleTimeout and documents WriteTimeout. ”

Page 6: go 1.8 net/http timeouts

NOTABLE ARTICLES

https://blog.cloudflare.com/

The complete guide to Go net/http timeouts

So you want to expose Go on the Internet

Written by @FiloSottile (Filippo Valsorda)

“ Back when crypto/tls was slow and net/http young,the general wisdom was to always put Go servers

behind a reverse proxy like NGINX.That's not necessary anymore! ”

Page 7: go 1.8 net/http timeouts

STUDY TIMEOUTS

Page 8: go 1.8 net/http timeouts

SOCKET TIMEOUTS

net.Conn interface

SetDeadline (SetReadDeadline/SetWriteDeadline)

I/O operation with timeout

Let’s Socket Programming!

Socket is an API working on transport layer

Go TCP

Go TCP

socket

bind

listen

accept

Conn

Transport Layer

Page 9: go 1.8 net/http timeouts

HTTP SERVER TIMEOUTS Application Layer

Go1.8

Go1.7

new!

ReadHeaderTimeout

These images are quoted from Filippo’s article on https://blog.cloudflare.com

Page 10: go 1.8 net/http timeouts

HTTP SERVER TIMEOUTS

net/http: no way of manipulating timeouts in Handler #16100

issued at 2016-06-18 (Go 1.6.x)

Go 1.8 introduces ReadHeaderTimeout

Reset read deadline after reading the request header

Application Layer

“ Go 1.8 introduces ReadHeaderTimeout, which only covers up to the request headers. However, there's still no clear way to do reads

with timeouts from a Handler. ”

Page 11: go 1.8 net/http timeouts

HTTP CLIENT TIMEOUTS Application Layer

This image is quoted from Filippo’s article on https://blog.cloudflare.com

“ Client-side timeouts can be simpler or much more complex, … ”

Page 12: go 1.8 net/http timeouts

CONTEXT PACKAGE

context is standard way

the advantage

a request will cancel if parent context would cancel

ctx, cancel := context.WithCancel(context.TODO())

timer := time.AfterFunc(5*time.Second, func() {

cancel()

})

req, err := http.NewRequest("GET", “http://example.com”, nil)

if err != nil {

log.Fatal(err)

}

req = req.WithContext(ctx)

Page 13: go 1.8 net/http timeouts

SUMMARY

Timeouts is important for effective/stable Web service.

including against malicious attack (DoS/DDoS)

Go 1.8 http.Server is enough stable!