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
390
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
160
sync/v2 プロポーザルの 背景と sync.Pool について
matumoto
0
470
Goトランザクション処理
matumoto
1
52
いまいちどスライスの 挙動を見直してみる
matumoto
0
350
Go1.22のリリース予定の機能を見る
matumoto
0
69
GoのUnderlying typeについて
matumoto
0
200
Typed-nilについて
matumoto
0
330
GoのType Setsという概念
matumoto
0
29
Webプッシュ通知触ってみた
matumoto
0
36
Other Decks in Technology
See All in Technology
AI-ready"のための"データ基盤 〜 LLMOpsで事業貢献するための基盤づくり
ismk
0
150
品質保証の取り組みを広げる仕組みづくり〜スキルの移譲と自律を支える実践知〜
tarappo
2
820
Pythonで構築する全国市町村ナレッジグラフ: GraphRAGを用いた意味的地域検索への応用
negi111111
8
3.3k
AWS 環境で GitLab Self-managed を試してみた/aws-gitlab-self-managed
emiki
0
350
LLM APIを2年間本番運用して苦労した話
ivry_presentationmaterials
16
11k
What's the recommended Flutter architecture
aakira
0
420
開発者が知っておきたい複雑さの正体/where-the-complexity-comes-from
hanhan1978
6
2.4k
LINE公式アカウントの技術スタックと開発の裏側
lycorptech_jp
PRO
0
330
Zabbix Conference Japan 2025 ダッシュボードコンテストLT
katayamatg
0
150
Flutter DevToolsで発見! 本番アプリのパフォーマンス問題と改善の実践
goto_tsl
1
250
AIと共に開発する時代の組織、プロセス設計 freeeでの実践から見えてきたこと
freee
3
540
仕様駆動 x Codex で 超効率開発
ismk
2
1.3k
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
4 Signs Your Business is Dying
shpigford
186
22k
Statistics for Hackers
jakevdp
799
220k
Imperfection Machines: The Place of Print at Facebook
scottboms
269
13k
Why You Should Never Use an ORM
jnunemaker
PRO
60
9.6k
How to Ace a Technical Interview
jacobian
280
24k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
YesSQL, Process and Tooling at Scale
rocio
174
15k
A better future with KSS
kneath
239
18k
Done Done
chrislema
186
16k
Six Lessons from altMBA
skipperchong
29
4.1k
We Have a Design System, Now What?
morganepeng
54
7.9k
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で公開しています〜
ありがとうございました