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
通信の不安定さに悩んでいたらシュッとプロキシを書けて改善できちゃった話
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
970
Other Decks in Programming
See All in Programming
Are APIs Still Relevant in the AI Era?
soyuka
0
270
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
210
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
130
海上で動くGoサーバー: goroutineとchannelでさばく航行データストリーム
atsuki_seo
0
730
【高い買い物LT会】初任給で話題の国産フィジカルAIを買った話
akagami
PRO
0
160
thread_parallel_with_free-threaded_Python_and_NumPy.pdf
riku_sakamoto
0
350
スマート反転とウェブアクセシビリティ
camiha
0
210
setup-vp GitLab対応の裏側
naokihaba
0
110
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
290
JRuby: Past, Present, and Future
headius
0
120
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2k
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
180
Featured
See All Featured
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Ethics towards AI in product and experience design
skipperchong
2
380
My Coaching Mixtape
mlcsv
0
320
Abbi's Birthday
coloredviolet
4
10k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
Writing Fast Ruby
sferik
630
63k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
500
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
57k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
540
Building Adaptive Systems
keathley
44
3.2k
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! ご清聴ありがとうございました!