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
330
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
sync/v2 プロポーザルの 背景と sync.Pool について
matumoto
0
73
Goトランザクション処理
matumoto
0
36
いまいちどスライスの 挙動を見直してみる
matumoto
0
330
Go1.22のリリース予定の機能を見る
matumoto
0
62
GoのUnderlying typeについて
matumoto
0
190
Typed-nilについて
matumoto
0
290
GoのType Setsという概念
matumoto
0
23
Webプッシュ通知触ってみた
matumoto
0
31
拡張ユークリッドの互除法の紹介
matumoto
0
250
Other Decks in Technology
See All in Technology
整頓のジレンマとの戦い〜Tidy First?で振り返る事業とキャリアの歩み〜/Fighting the tidiness dilemma〜Business and Career Milestones Reflected on in Tidy First?〜
bitkey
2
16k
20250705 Headlamp: 專注可擴展性的 Kubernetes 用戶界面
pichuang
0
270
さくらのIaaS基盤のモニタリングとOpenTelemetry/OSC Hokkaido 2025
fujiwara3
3
450
無意味な開発生産性の議論から抜け出すための予兆検知とお金とAI
i35_267
4
13k
United Airlines Customer Service– Call 1-833-341-3142 Now!
airhelp
0
170
Delegating the chores of authenticating users to Keycloak
ahus1
0
140
fukabori.fm 出張版: 売上高617億円と高稼働率を陰で支えた社内ツール開発のあれこれ話 / 20250704 Yoshimasa Iwase & Tomoo Morikawa
shift_evolve
PRO
2
7.8k
品質と速度の両立:生成AI時代の品質保証アプローチ
odasho
1
360
How Do I Contact HP Printer Support? [Full 2025 Guide for U.S. Businesses]
harrry1211
0
120
ビズリーチが挑む メトリクスを活用した技術的負債の解消 / dev-productivity-con2025
visional_engineering_and_design
3
7.7k
開発生産性を組織全体の「生産性」へ! 部門間連携の壁を越える実践的ステップ
sudo5in5k
2
7.2k
第4回Snowflake 金融ユーザー会 Snowflake summit recap
tamaoki
1
290
Featured
See All Featured
Java REST API Framework Comparison - PWX 2021
mraible
31
8.7k
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
Become a Pro
speakerdeck
PRO
29
5.4k
Why Our Code Smells
bkeepers
PRO
336
57k
Documentation Writing (for coders)
carmenintech
72
4.9k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
The World Runs on Bad Software
bkeepers
PRO
69
11k
Being A Developer After 40
akosma
90
590k
The Cult of Friendly URLs
andyhume
79
6.5k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
970
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
107
19k
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で公開しています〜
ありがとうございました