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
460
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
71
いまいちどスライスの 挙動を見直してみる
matumoto
0
380
Go1.22のリリース予定の機能を見る
matumoto
0
77
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
作るべきものと向き合う - ecspresso 8年間の開発史から学ぶ技術選定 / 技術選定con findy 2026
fujiwara3
7
2.1k
大規模サービスにおける レガシーコードからReactへの移行
magicpod
1
130
Kaggleで鍛えたスキルの実務での活かし方 競技とプロダクト開発のリアル
recruitengineers
PRO
1
150
Agentic Codingの実践とチームで導入するための工夫
lycorptech_jp
PRO
0
410
入門DBSC
ynojima
0
130
Digitization部 紹介資料
sansan33
PRO
1
7k
AIエンジニア Devin と歩む、自律型運用プロセスの構築
a2ito
0
680
Kaggleの経験が実務にどう活きているか / kaggle_findy
sansan_randd
4
750
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
4k
Claude Cowork Plugins を読む - Skills駆動型業務エージェント設計の実像と構造
knishioka
0
260
技術的負債の泥沼から組織を救う3つの転換点
nwiizo
7
2.1k
LINE Messengerの次世代ストレージ選定
lycorptech_jp
PRO
19
7.3k
Featured
See All Featured
WCS-LA-2024
lcolladotor
0
470
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
200
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
280
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8k
My Coaching Mixtape
mlcsv
0
63
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.2k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.7k
A Tale of Four Properties
chriscoyier
162
24k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.1k
WENDY [Excerpt]
tessaabrams
9
36k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.3k
The browser strikes back
jonoalderson
0
760
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で公開しています〜
ありがとうございました