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
310
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
52
Goトランザクション処理
matumoto
0
35
いまいちどスライスの 挙動を見直してみる
matumoto
0
320
Go1.22のリリース予定の機能を見る
matumoto
0
61
GoのUnderlying typeについて
matumoto
0
180
Typed-nilについて
matumoto
0
270
GoのType Setsという概念
matumoto
0
22
Webプッシュ通知触ってみた
matumoto
0
31
拡張ユークリッドの互除法の紹介
matumoto
0
250
Other Decks in Technology
See All in Technology
TerraformをSaaSで使うとAzureの運用がこんなに楽ちん!HCP Terraformって何?
mnakabayashi
0
130
Create a Rails8 responsive app with Gemini and RubyLLM
palladius
0
120
菸酒生在 LINE Taiwan 的後端雙刀流
line_developers_tw
PRO
0
190
ObsidianをMCP連携させてみる
ttnyt8701
2
120
OpenTelemetry Collector internals
ymotongpoo
5
550
Cloud Native Scalability for Internal Developer Platforms
hhiroshell
2
460
新規プロダクト開発、AIでどう変わった? #デザインエンジニアMeetup
bengo4com
0
460
IIWレポートからみるID業界で話題のMCP
fujie
0
370
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
7.3k
Javalinの紹介
notoh
0
110
Amplifyとゼロからはじめた AIコーディング 成果と展望
mkdev10
1
250
RubyOnRailsOnDevin+α / DevinMeetupJapan#2
ginkouno
0
440
Featured
See All Featured
Building Applications with DynamoDB
mza
95
6.4k
The Art of Programming - Codeland 2020
erikaheidi
54
13k
Building a Modern Day E-commerce SEO Strategy
aleyda
41
7.3k
Product Roadmaps are Hard
iamctodd
PRO
53
11k
Bash Introduction
62gerente
614
210k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
32
5.9k
BBQ
matthewcrist
89
9.7k
Docker and Python
trallard
44
3.4k
Designing for Performance
lara
609
69k
Designing Experiences People Love
moore
142
24k
Six Lessons from altMBA
skipperchong
28
3.8k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
29
9.5k
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で公開しています〜
ありがとうございました