go 1.8 net/http timeouts

Post on 11-Apr-2017

1.490 views 1 download

Transcript of go 1.8 net/http timeouts

GO1.8 NET/HTTP TIMEOUTS

2017-03-25 Tetsuya Morimoto

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

GO 1.8 FEATURE

MINOR CHANGES

Go 1.8 net/http changes from release note

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

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! ”

STUDY 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

HTTP SERVER TIMEOUTS Application Layer

Go1.8

Go1.7

new!

ReadHeaderTimeout

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

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. ”

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, … ”

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)

SUMMARY

Timeouts is important for effective/stable Web service.

including against malicious attack (DoS/DDoS)

Go 1.8 http.Server is enough stable!