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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
950
Other Decks in Programming
See All in Programming
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
180
20260623_Loop Engineeringで自分の分身の問い合わせBotを作る
ryugen04
0
200
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
240
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
480
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
270
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
260
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
180
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.8k
Creating Composable Callables in Contemporary C++
rollbear
0
200
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
8
3.7k
トークンをケチるな、設計しろ:GitHub Copilotを賢く使うコンテキスト戦略
ochtum
0
310
関数型プログラミングのメリットって何だろう?
wanko_it
0
160
Featured
See All Featured
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
370
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.5k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
560
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
170
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.7k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
2
320
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Designing Powerful Visuals for Engaging Learning
tmiket
1
450
What's in a price? How to price your products and services
michaelherold
247
13k
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! ご清聴ありがとうございました!