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
GoのRateLimit処理の実装
Search
matumoto
March 19, 2023
Technology
0
450
GoのRateLimit処理の実装
2023/03/19に行われた日大Joken&会津大Zli 合同LTでの発表資料です
イベントページはこちら
-
https://zli.connpass.com/event/277175/
matumoto
March 19, 2023
Tweet
Share
More Decks by matumoto
See All by matumoto
testingを眺める
matumoto
1
180
sync/v2 プロポーザルの 背景と sync.Pool について
matumoto
0
650
Goトランザクション処理
matumoto
1
70
いまいちどスライスの 挙動を見直してみる
matumoto
0
380
Go1.22のリリース予定の機能を見る
matumoto
0
76
GoのUnderlying typeについて
matumoto
0
220
Typed-nilについて
matumoto
0
350
GoのType Setsという概念
matumoto
0
40
Webプッシュ通知触ってみた
matumoto
0
39
Other Decks in Technology
See All in Technology
"共通化"と"Embed"のブレンドでスケール可能な運用を!M&Aを支えるGENDA SREの実践 / GENDA Tech Talk #3
genda
0
230
生成AI素人でも玄人でもない私がセイセイAIチョットワカルために勉強したこと
wkm2
2
310
xDS を活用したサービスディスカバリーで実現するブランチ別 QA 環境の構築手法
knwoop
1
200
NW構成図の自動描画は何が難しいのか?/netdevnight3
corestate55
2
120
LINEアプリ開発のための Claude Code活用基盤の構築
lycorptech_jp
PRO
0
540
Amazon Bedrock AgentCoreでブラウザ拡張型AI調査エージェントを開発した話 (シングルエージェント編)
nasuvitz
2
110
AWS Bedrock Guardrails / 機密情報の入力・出力をブロックする — Blocking Sensitive Information Input/Output
kazuhitonakayama
2
160
使って学ぼう MCP (と GitHub Codespaces)
tsubakimoto_s
1
210
ブログの作成に音声AIツールを使って音声入力しようとした話
smt7174
1
150
競争優位を生み出す戦略的内製開発の実践技法
masuda220
PRO
0
240
「OSアップデート:年に一度の「大仕事」を乗り切るQA戦略」_Mobile Tech Flex 〜4社合同!私たちのモバイル開発自慢大会〜
gu3
0
210
欲しいを叶える個人開発の進め方 / How to Run an Indie Project That Brings Your Ideas to Life
endohizumi
0
300
Featured
See All Featured
Crafting Experiences
bethany
1
65
Paper Plane
katiecoart
PRO
0
47k
sira's awesome portfolio website redesign presentation
elsirapls
0
160
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
GraphQLとの向き合い方2022年版
quramy
50
14k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
The untapped power of vector embeddings
frankvandijk
2
1.6k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Transcript
GoのRateLimit処理の実装 日大Joken&会津大Zli 合同LT 2023/03/19
• 学年:28期(学部3年) • 所属:会津大学コンピュータ理工学部 • 今興味のある技術:Goʕ◔ϖ◔ʔ • 趣味: ◦ ゲームしたりマンガ読んだり
▪ 最近モンハンで傀異Lv199になりました ▪ イカᔦꙬᔨもやっています ◦ 競プロ ▪ 春休み中、平日21時にくじかつしてます • Twitter:@matumoto_1234 matumoto 松本 響輝 自己紹介
目次 • RateLimitについて • トークンバケット • クライアント側での導入
そもそもRateLimitってなに • APIとかでの回数制限的なやつ • APIを呼びすぎてしまうのを防ぐ目的でつけられてたりすることが多い • 例. ◦ Twitter:1日で2400ツイート ◦
Slack:メッセージの投稿は1秒に1回 ◦ GitHub:検索クエリは1分で30リクエスト
そもそもRateLimitってなに • APIとかでの回数制限的なやつ • APIを呼びすぎてしまうのを防ぐ目的でつけられてたりすることが多い • 例. ◦ Twitter:1日で2400ツイート ◦
Slack:メッセージの投稿は1秒に1回 ◦ GitHub:検索クエリは1分で30リクエスト これがサーバー側で 設定されてないと大量のリクエストで爆発してしまう 🤯
GoでのRateLimit処理の実装 • 調べてみた感じ、golang/x/time/rate という準標準のパッケージが使われるのが多いっぽい • そのパッケージでは「トークンバケット」というアルゴリズムを元に実装がなされている
トークンバケット
トークンバケットの目的 • トークンバケットはリクエストの流れをなるべく平均化して処理するのが目的 リクエスト リクエスト リクエスト リクエスト 時間 リクエスト リクエスト
リクエスト RateLimitの基準
トークンバケットの目的 • トークンバケットはリクエストの流れをなるべく平均化して処理するのが目的 リクエスト リクエスト リクエスト リクエスト 時間 リクエスト リクエスト
リクエスト RateLimitの基準
トークンバケットについて • トークン、バーストという概念がある • トークン := 受付可能な残りリクエスト数 • バースト :=
1秒間に受付可能な最大リクエスト数 • トークンは1リクエストにつき1個消費する • トークンは1秒につき r 個補充される • リクエストが来た段階でトークンがなくなっていた場合、トークンが補充されるまで待つ
トークンバケットについて • 例1. トークンが1秒につき2個回復、バースト(1秒間最大リクエスト数)は5000兆とする。 リクエスト リクエスト リクエスト リクエスト 時間 リクエスト
リクエスト リクエスト
トークンバケットについて • 例1. トークンが1秒につき2個回復、バースト(1秒間最大リクエスト数)は5000兆とする。 リクエスト リクエスト リクエスト リクエスト 時間 リクエスト
リクエスト リクエスト 0 0 0 2 4 5 トークン:
トークンバケットについて • 例2. トークンが1秒につき2個回復、バースト(1秒間最大リクエスト数)は5000兆とする。 リクエスト リクエスト リクエスト リクエスト 時間 リクエスト
リクエスト リクエスト
トークンバケットについて • 例2. トークンが1秒につき2個回復、バースト(1秒間最大リクエスト数)は5000兆とする。 リクエスト リクエスト リクエスト リクエスト 時間 リクエスト
リクエスト リクエスト 2 0 0 2 4 5 トークン:
トークンバケットについて • 例3. トークンが1秒につき2個回復、バースト(1秒間最大リクエスト数)は2とする。 リクエスト リクエスト リクエスト リクエスト 時間 リクエスト
リクエスト リクエスト
トークンバケットについて • 例3. トークンが1秒につき2個回復、バースト(1秒間最大リクエスト数)は2とする。 リクエスト リクエスト リクエスト リクエスト 時間 リクエスト
リクエスト リクエスト 2 2 2 2 4 5 トークン: バースト
サンプルコード • golang.org/x/time/rateパッケージを使って簡単に動かしてみる
サンプルコード • golang.org/x/time/rateパッケージを使って簡単に動かしてみる
クライアント側での導入
クライアント側での導入 • では、RateLimit処理を使えば「2秒ごとにリクエストをする」みたいなこともいいかんじに抽象化 できるのでは?🤔 • →できます! 今回はhttp.RoundTripperとして抽象化する方法を紹介
http.RoundTripperって? • net/httpパッケージのhttp.Clientのフィールドにいるやつ •
http.RoundTripperって? • net/httpパッケージのhttp.Clientのフィールドにいるやつ •
http.RoundTripperの定義 • http.RoundTripperはインターフェースとして定義されている
http.RoundTripperの定義 • http.RoundTripperはインターフェースとして定義されている
http.Client.Transportの拡張 • GoでHTTPリクエストを行う場合、http.Client.Transportを通して、最終的に http.RoundTripper.RoundTrip()が呼び出される • http.Client.Transport は http.RoundTripper インターフェースを実装していれば 良いので、自由に置き換えることが可能!
• よって、今回はhttp.RateLimitTransportを実装する
サンプルコード • RateLimitTransportに、RoundTrip()を実装する • フィールドにTransportを持たせることで、他のhogeTransportと重ねることも可能
サンプルコード • RateLimitTransportに、RoundTrip()を実装する
まとめ • GoでのRateLimit処理は golang/x/time/rate パッケージが使われがち • そのパッケージではトークンバケットというアルゴリズムが元になっている • http.RoundTripperを実装して抽象化できる https://github.com/matumoto1234/go-rate-limit-sample
今回使用したコードの一部は GitHubで公開しています〜
ありがとうございました