Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
http.Client in go
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Buzzvil
April 14, 2021
Programming
0
270
http.Client in go
By Raf
Buzzvil
April 14, 2021
Tweet
Share
More Decks by Buzzvil
See All by Buzzvil
220903_GFS
buzzvil
0
570
Git 해부하기 2 + 3
buzzvil
0
58
Metastable Failure
buzzvil
0
290
Git 해부하기
buzzvil
0
70
Introduction to Plate Solving
buzzvil
0
63
Airbnb Minerva
buzzvil
0
440
Shape up 방법론
buzzvil
0
1k
Buzzvil Billing Data Pipeline
buzzvil
0
660
Journey of Dash's release-cycle
buzzvil
0
220
Other Decks in Programming
See All in Programming
それはエンジニアリングの糧である:AI開発のためにAIのOSSを開発する現場より / It serves as fuel for engineering: insights from the field of developing open-source AI for AI development.
nrslib
1
430
AI Assistants for Your Angular Solutions
manfredsteyer
PRO
0
150
AIに任せる範囲を安全に広げるためにやっていること
fukucheee
0
150
Migration to Signals, Signal Forms, Resource API, and NgRx Signal Store @Angular Days 03/2026 Munich
manfredsteyer
PRO
0
120
Codex CLIのSubagentsによる並列API実装 / Parallel API Implementation with Codex CLI Subagents
takatty
1
130
「効かない!」依存性注入(DI)を活用したAPI Platformのエラーハンドリング奮闘記
mkmk884
0
150
我々はなぜ「層」を分けるのか〜「関心の分離」と「抽象化」で手に入れる変更に強いシンプルな設計〜 #phperkaigi / PHPerKaigi 2026
shogogg
2
140
ふつうの Rubyist、ちいさなデバイス、大きな一年
bash0c7
0
1.1k
Claude Codeセッション現状確認 2026福岡 / fukuoka-aicoding-00-beacon
monochromegane
4
450
「やめとこ」がなくなった — 1月にZennを始めて22本書いた AI共創開発のリアル
atani14
0
410
クライアントワークでSREをするということ。あるいは事業会社におけるSREと同じこと・違うこと
nnaka2992
1
350
Claude Codeログ基盤の構築
giginet
PRO
7
3.5k
Featured
See All Featured
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Marketing to machines
jonoalderson
1
5k
How STYLIGHT went responsive
nonsquared
100
6k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
300
Practical Orchestrator
shlominoach
191
11k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.8k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.2k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
790
Rebuilding a faster, lazier Slack
samanthasiow
85
9.4k
Side Projects
sachag
455
43k
Test your architecture with Archunit
thirion
1
2.2k
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