go 1.8 net/http timeouts
-
Upload
yahoo -
Category
Technology
-
view
1.490 -
download
1
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
RECENT WORK
Qiita
[ ] (SRE)
Go 1.8 Graceful Shutdown
Python
3/21
3/18
1/27
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!