Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(backend): 各種APIエンドポイントでレートリミットにあたったときRetry-Afterヘッダーを返してほしい #13562

Closed
1 task
KisaragiEffective opened this issue Mar 12, 2024 · 2 comments · Fixed by #13949
Labels
✨Feature This adds/improves/enhances a feature packages/backend Server side specific issue/PR

Comments

@KisaragiEffective
Copy link
Collaborator

Summary

各種APIエンドポイントでレートリミットにあたったときRetry-Afterヘッダーを返してほしい
related: #4838

Purpose

現状Retry-Afterがなければレートリミットを確かめることができるエンドポイントも無いため、実際にAPIへのリクエストが通るか、あるいは429で拒否されるかはリクエストを投げてみるまでわからない。
しかし、実際にリクエストを投げると大抵1は429がまた帰ってくる。
これはクライアントにとってもサーバーにとっても余計なHTTPコネクションをハンドルしなければならなくなるため、よくない。

そこで、レートリミットが発動した際は次にレートリミットがリセットされる時点までの期間を秒単位に切り上げてRetry-Afterヘッダから報告することを提案する。

Do you want to implement this feature yourself?

  • Yes, I will implement this by myself and send a pull request

Footnotes

  1. これはクリップにノートを追加するときやスレッドをミュートする時に顕著である

@KisaragiEffective KisaragiEffective added the ✨Feature This adds/improves/enhances a feature label Mar 12, 2024
@kakkokari-gtyih
Copy link
Contributor

kakkokari-gtyih commented Mar 12, 2024

レートリミットの詳細を公開することにより不都合があるとどこかで誰かが言っていたような気がする
#4838 にはなかったので気のせいかもしれない)

@KisaragiEffective
Copy link
Collaborator Author

KisaragiEffective commented Jun 5, 2024

note to myself:

  • 一部のエンドポイントは固有のレートリミット(?)を持つ。
    • そのようなエンドポイントはpackages/backend/src/server/api/endpoints下でexport const meta\s*=\s*\{([^{]|\n)*limitを使うことで検索することができる。ここで出てきたlimitはレートリミットのウィンドウがリセットされるまでの時間である。
  • ファクターは二つの要素に使われる。
    • 一つは次にリセットされるまでの時間に乗算され、結果として100%以上のファクターはデフォルトよりレートリミットのウィンドウを長くして、100%以下のファクターは短くする。
    • もう一つは最大回数の除算に使われる。結果として100%以上のファクターはデフォルトより呼び出し回数を少なくし、100%以下のファクターは長くする。
  • 一部のエンドポイントは二次レートリミットを持つ。
    • そのようなエンドポイントはminIntervalというプロパティをpackages/backend/src/server/api/endpoints下のファイル内のmetaで持っている。
    • これらのエンドポイントは最小呼び出し間隔よりも短い間隔での呼び出しを拒絶する。次に、他のレートリミットを持つエンドポイントと同様に一般レートリミットのウィンドウ内で呼び出し回数が制限よりも多ければ拒絶する。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
✨Feature This adds/improves/enhances a feature packages/backend Server side specific issue/PR
Projects
No open projects
Status: Done
Development

Successfully merging a pull request may close this issue.

3 participants