Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
http.Client in go
Search
Buzzvil
April 14, 2021
Programming
350
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
http.Client in go
By Raf
Buzzvil
April 14, 2021
More Decks by Buzzvil
See All by Buzzvil
220903_GFS
buzzvil
0
740
Git 해부하기 2 + 3
buzzvil
0
82
Metastable Failure
buzzvil
0
440
Git 해부하기
buzzvil
0
110
Introduction to Plate Solving
buzzvil
0
99
Airbnb Minerva
buzzvil
0
630
Shape up 방법론
buzzvil
0
1.2k
Buzzvil Billing Data Pipeline
buzzvil
0
790
Journey of Dash's release-cycle
buzzvil
0
340
Other Decks in Programming
See All in Programming
AI Augmentation Techniques with Liberty
ivargrimstad
1
400
AI時代のFlutter品質設計 — アプリ品質を守るQuality Layers
omatty198
0
360
Getting Started with Vibe Coding
miccheng
0
190
オーケストレーション記述言語 Katari
yukikurage
0
240
クラウドエージェントは、 何がそんなに便利なのか / what makes cloud agents so useful
rkaga
5
800
AI時代のシニアエンジニアとは
yosuke_furukawa
PRO
15
11k
小さなアプリを作って公開するまで
onozaty
0
140
baseline으로 마이그레이션, 리팩토링 안전하게 맡기기
fornewid
1
930
Seven New Principles of Software Engineering
yegor256
0
470
Engineering Biometric UX Across Android Versions | DroidKnights 2026
ryunen344
1
190
Kawaiicon: Kubernetes, it's no longer cool, but let's secure it anyway!
barnbarn
0
110
AI時代のTerminal環境を UNIX哲学で設計・運用する
yasunori0418
1
350
Featured
See All Featured
Game over? The fight for quality and originality in the time of robots
wayneb77
1
330
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
70
68k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
A Soul's Torment
seathinner
8
3.9k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.9k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.7k
Making the Leap to Tech Lead
cromwellryan
135
10k
How to train your dragon (web standard)
notwaldorf
96
6.9k
Large-scale JavaScript Application Architecture
addyosmani
516
110k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
48k
Exploring anti-patterns in Rails
aemeredith
4
560
Transcript
http.Client in go 1.15.6
http.Client가 쓰이는 곳 - RESTful API - elastic search -
AWS endpoint http.Client 안씀 - RDBMS connection (postgresql, mysql) - gRPC - redis
http.Client, http.Transport http.Client: 껍데기 http.Transport: 실제 요청 처리
http.Transport 실제 http요청이 처리되는 구현체 connection pool을 들고 있어서 goroutine-safe
함
client.Do(req) client := &http.Client{} // init 시점에 한번만 생성 req
:= http.Request { … } res, err := client.Do(req) if err != nil { … } defer res.Body.Close() …
Transport shared variables
getConn()
tryPutIdleConn()
default values
http.ClientTrace trace := &httptrace.ClientTrace{ GetConn: func(hostPort string) { fmt.Println(“%s”, hostPort)
}, } req.WithContext(httptrace.WithClientTrace(req.Context(), trace)) res, err := client.Do(req)
httptrace.ClientTrace Request 1. http.Client.Do(req) 2. RoundTrip() 3. GetConn() 4. idleConn
가져오기 실패 5. idleConnWait에 req 등록 6. go dialConnFor()
1. DNS Lookup 2. DNSStart() 3. DNSDone() 4. Connect 5.
ConnectStart() 6. ConnectDone() 7. TLSHandshake 8. TLSHandshakeStart() 9. TLSHandshakeDone() 10. go readLoop() 11. go writeLoop() httptrace.ClientTrace Request dialConnFor()
httptrace.ClientTrace Request dialConnFor() pc.readLoop() pc.writeLoop() 1. <- pc.reqch 12. tryDeliver(pc)
7. GotConn() 8. pc.roundTrip() 9. pc.writech <- WriteRequest 10. pc.reqch <- requestAndChan 11. <- WriteErrch, resc 1. <- pc.writech
httptrace.ClientTrace Request pc.readLoop() pc.writeLoop() 2. br.peek(1) 3. GotFirstResponseByte() 4. ReadResponse(br)
5. Got100Continue() 6. continueCh <- {} 2. WroteHeaderField() 3. WroteHeaders() 4. Wait100Continue() 5. <- continueCh 6. bw.write(req) 7. WroteRequest() <- pc.writech
httptrace.ClientTrace Request pc.readLoop() 7. ReadResponse(br) 8. requestAndChan.resc <- body 9.
<- waitForBodyRead 10. tryPutIdleConn() 11. PutIdleConn() <- pc.reqch 12. ended roundTrip() 13. ended http.Client.Do() 14. call res.body.Close()
request가 완료되었을때 trace는?? - 커넥션을 받고 난 뒤 실제 요청을
던지는 시점: GotConn() - request가 완료되었을때 trace는 RoundTripper interface를 활용해야함 - http.Client에 transport가 interface로 들어가므로, wrapper를 씌워서 transport.RoundTrip이 끝나는 시점에 trace를 남김
Datadog에 timespan을 보여주기 적절한 trace 방식 1. Transport Wrapper에서 RoundTrip
시작 전에 Trace 2. Transport.RoundTrip() 호출 3. Transport에서 GetConn() 호출 3. Transport에서 GotConn() 호출 4. Transport Wrapper에서 RoundTrip이 완료되었을때 Trace connection을 받는데 걸리는 시간 요청을 보내고, 응답을 받는데 걸리는 시간
요약 1. http.Transport는 한개만 쓸것 2. http.Client.Do()가 끝나고 err가 없으면
res.Body.Close()를 호출할것 3. httptrace.GetConn/GotConn을 활용하여 connect 의 timespan 분리 4. MaxIdleConnsPerHost를 잘 조정하자 (=MaxIdleConns / #hosts)
끝 컨플루언스 문서 • [Golang] http connection management • [Golang]
http.persistConn, httptrace.ClientTrace