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
通信の不安定さに悩んでいたらシュッとプロキシを書けて改善できちゃった話
Search
SUZUKI Yoshiharu
June 06, 2024
Programming
680
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
通信の不安定さに悩んでいたらシュッとプロキシを書けて改善できちゃった話
SUZUKI Yoshiharu
June 06, 2024
More Decks by SUZUKI Yoshiharu
See All by SUZUKI Yoshiharu
マイクロサービスのローカル開発環境をTiltを使って2年運用して得た知見
bellwood4486
1
960
Other Decks in Programming
See All in Programming
仕様駆動開発の消費期限
watany
20
8.9k
Loosening the Reins: Go Generics Get More Flexible
kuro_kurorrr
0
310
異なる設計思想のフレームワークを経験して得た学び
amekuhideki
1
420
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
170
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
5
530
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
380
Android CLI
fornewid
0
230
不幸な GC
chencmd
0
730
KotlinConf Extended South Korea 2026 Keynote
l2hyunwoo
0
120
Go を使い始めて 2 ヶ月の学び / My first two months with Go
contour_gara
0
380
楽しそうなつよつよエンジニアと目が死んでる僕/A brilliant engineer having a blast, and dead-eyed me.
3l4l5
2
240
レビュー履歴をAIに食わせて、 Compose移行を加速するs
shihochan
0
210
Featured
See All Featured
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
280
The Cost Of JavaScript in 2023
addyosmani
55
10k
Abbi's Birthday
coloredviolet
3
9.4k
The untapped power of vector embeddings
frankvandijk
2
1.8k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Google's AI Overviews - The New Search
badams
0
1.1k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
470
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.5k
Darren the Foodie - Storyboard
khoart
PRO
3
3.7k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
490
Transcript
通信の不安定さに悩んでいたら シュッとプロキシを書けて 改善できちゃった話 鈴⽊ 善晴 / 株式会社HRBrain 2024.06.08 Go Conference
2024
2 ⾃⼰紹介 ▪名前 鈴⽊ 善晴 / Yoshiharu Suzuki ▪所属 株式会社
HRBrain テックリード 兼 バックエンドエンジニア ▪Go歴 4年
3 本LTのアウトカム🎁 「HTTP通信を制御するプロキシ」のGoの実装例 を知ることができる
4 アジェンダ 01 背景とアプローチ 02 プロキシの説明 03 まとめ
5 アジェンダ 01 背景とアプローチ 02 プロキシの説明 03 まとめ 0:50
6 弊社は、⼈事領域のSaaSを開発しています!
リクエストが集中すると、SSHトンネルで通信が失敗する…。 7 開発環境が不安定問題😢
プロキシを挟んで制御を試みる 8 同時通信を抑えれば改善できるのでは?🤔
9 アジェンダ 01 背景とアプローチ 02 プロキシの説明 03 まとめ 1:50
10 構成技術 標準(または準標準)の技術だけで、2⽇程度でプロキシを実現! • http.RoundTripper インターフェース … 「⼀回のHTTP通信」を表すインターフェース • golang.org/x/sync/semaphore
パッケージ … セマフォの提供 💡セマフォとは? • コンピュータの並行処理において、共有リソースのアクセスを制御し、 競合を防ぐための機構 • カウンターを用いて、特定のリソースの利用可能数を管理する
11 ⼟台となるリバースプロキシを⽤意する func main() { target, _ := url.Parse("http://localhost:8080") //
リバースプロキシの作成 proxy := httputil.NewSingleHostReverseProxy(target) // サーバ起動 srv := &http.Server{ Addr: ":9999", Handler: proxy, } _ = srv.ListenAndServe() }
12 通信に⼿を⼊れる余地を作る http.RoundTripperを加える // カスタマイズするための構造体 type c struct{} func (c
*c) RoundTrip(r *http.Request) (*http.Response, error) { // 標準で用意されているデフォルト実装へ移譲するだけ return http.DefaultTransport.RoundTrip(r) } func main() { ... proxy := httputil.NewSingleHostReverseProxy(target) // プロキシの動きをカスタマイズ proxy.Transport = &c{} ... } 2:50
13 同時通信に上限を設定して完成🙌 semaphoreも加える type c struct { sem *semaphore.Weighted //
同時通信を制御するセマフォ } func (c *c) RoundTrip(r *http.Request) (*http.Response, error) { _ = c.sem.Acquire(r.Context(), 1) // 1通信につき1つ使う defer c.sem.Release(1) // 最後に解放 return http.DefaultTransport.RoundTrip(r) } func main() { ... proxy := httputil.NewSingleHostReverseProxy(target) proxy.Transport = &c{ sem: semaphore.NewWeighted(1), // 同時通信の上限が1の例 } ... } 3:35
14 同時通信に上限を設定して完成🙌 semaphoreも加える type c struct { sem *semaphore.Weighted //
同時通信を制御するセマフォ } func (c *c) RoundTrip(r *http.Request) (*http.Response, error) { _ = c.sem.Acquire(r.Context(), 1) // 1通信につき1つ使う defer c.sem.Release(1) // 最後に解放 return http.DefaultTransport.RoundTrip(r) } func main() { ... proxy := httputil.NewSingleHostReverseProxy(target) proxy.Transport = &c{ sem: semaphore.NewWeighted(1), // 同時通信の上限が1の例 } ... }
15 アジェンダ 01 背景とアプローチ 03 まとめ 02 プロキシの説明 4:20
16 まとめ 1. プロキシで同時通信を制御する事例を紹介 ◦ 実際のソースコードはこちら https://github.com/bellwood4486/flow-limit-proxy 2. 標準(+準標準)パッケージで⽤意されていることも多い。 なので公式ドキュメントに⽬を通すのは⼤事!
◦ http.RoundTripper ◦ golang.org/x/sync/semaphore 3. ⼀つのことをうまくやるツールをシュッと作れるのは ”便利!” “楽しい!”
We are hiring! ご清聴ありがとうございました!