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
Buzzvil
April 14, 2021
Programming
280
0
Share
http.Client in go
By Raf
Buzzvil
April 14, 2021
More Decks by Buzzvil
See All by Buzzvil
220903_GFS
buzzvil
0
600
Git 해부하기 2 + 3
buzzvil
0
61
Metastable Failure
buzzvil
0
320
Git 해부하기
buzzvil
0
71
Introduction to Plate Solving
buzzvil
0
69
Airbnb Minerva
buzzvil
0
470
Shape up 방법론
buzzvil
0
1k
Buzzvil Billing Data Pipeline
buzzvil
0
690
Journey of Dash's release-cycle
buzzvil
0
240
Other Decks in Programming
See All in Programming
PHP で mp3 プレイヤーを実装しよう
m3m0r7
PRO
0
290
AI-DLC Deep Dive
yuukiyo
9
5k
GoogleCloudとterraform完全に理解した
terisuke
1
170
의존성 주입과 모듈화
fornewid
0
150
JAWS-UG横浜 #100 祝・第100回スペシャルAWS は VPC レスの時代へ
maroon1st
0
190
Firefoxにコントリビューションして得られた学び
ken7253
0
100
JOAI2026 1st solution - heron0519 -
heron0519
0
160
iOS機能開発のAI環境と起きた変化
ryunakayama
0
190
TiDBのアーキテクチャから学ぶ分散システム入門 〜MySQL互換のNewSQLは何を解決するのか〜 / tidb-architecture-study
dznbk
1
200
ハーネスエンジニアリングとは?
kinopeee
13
6.4k
〜バイブコーディングを超えて〜 チームで実験し続けたAI駆動開発
tigertora7571
0
180
AI時代のエンジニアリングの原則 / Engineering Principles in the AI Era
haru860
0
870
Featured
See All Featured
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
530
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
230
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
430
Building Flexible Design Systems
yeseniaperezcruz
330
40k
HDC tutorial
michielstock
2
640
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.4k
Heart Work Chapter 1 - Part 1
lfama
PRO
6
35k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
190
Making the Leap to Tech Lead
cromwellryan
135
9.8k
Docker and Python
trallard
47
3.8k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
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