アプリケーションの開発制限
このドキュメントは、GitLabにアプリケーションの制限を追加するための開発者向けのガイドです。
ドキュメント
まず最初に、情報を集め、GitLabの異なるティアに設定されている異なるリミットを決めなければなりません。それらの制限を文書化し、伝えるために他の人と調整しましょう。
アプリケーションの制限を導入するためのガイドがあります。
プラン制限の導入
データベースプラン制限の挿入
plan_limits
テーブルに新しい列を作成し、制限値を挿入します。マイグレーション・スクリプト・ファイルを2つに分けて作成することをお勧めします。
-
plan_limits
テーブルに新しいカラムを追加し、希望する制限値を表す NULL ではないデフォルト値を指定します:add_column(:plan_limits, :project_hooks, :integer, default: 100, null: false)
0
に設定されたプラン制限エントリは、制限が有効になっていないことを意味します。この設定は、特別な文書化された状況でのみ使用してください。 -
(オプション)
create_or_update_plan_limit
マイグレーション・ヘルパーを使用して、希望する制限で各レベルを微調整するデータベース・マイグレーションを作成します:class InsertProjectHooksPlanLimits < Gitlab::Database::Migration[2.1] def up create_or_update_plan_limit('project_hooks', 'default', 0) create_or_update_plan_limit('project_hooks', 'free', 10) create_or_update_plan_limit('project_hooks', 'bronze', 20) create_or_update_plan_limit('project_hooks', 'silver', 30) create_or_update_plan_limit('project_hooks', 'premium', 30) create_or_update_plan_limit('project_hooks', 'premium_trial', 30) create_or_update_plan_limit('project_hooks', 'gold', 100) create_or_update_plan_limit('project_hooks', 'ultimate', 100) create_or_update_plan_limit('project_hooks', 'ultimate_trial', 100) end def down create_or_update_plan_limit('project_hooks', 'default', 0) create_or_update_plan_limit('project_hooks', 'free', 0) create_or_update_plan_limit('project_hooks', 'bronze', 0) create_or_update_plan_limit('project_hooks', 'silver', 0) create_or_update_plan_limit('project_hooks', 'premium', 0) create_or_update_plan_limit('project_hooks', 'premium_trial', 0) create_or_update_plan_limit('project_hooks', 'gold', 0) create_or_update_plan_limit('project_hooks', 'ultimate', 0) create_or_update_plan_limit('project_hooks', 'ultimate_trial', 0) end end
GitLab.comにしか存在しないプランもあります。これは、存在しないプランに対してはノーオプションです。
プランの制限の検証
現在の制限を取得
現在の制限値へのアクセスは、プロジェクトまたはネームスペースを通じて行うことができます:
project.actual_limits.project_hooks
現在の制限の確認
電流制限を超過しているかどうかをチェックするPlanLimits#exceeded?
メソッドが1つあります。ActiveRecord
オブジェクトかInteger
を使用します。
レコードのカウントが定義された制限を超えないことを確認します:
project.actual_limits.exceeded?(:project_hooks, ProjectHook.where(project: project))
数が定義された制限を超えないようにします:
project.actual_limits.exceeded?(:project_hooks, 10)
Limitable
懸念
Limitable
concern は、モデルが制限を超えないことを検証するために使うことができます。これは、現在のモデルのレコード数が定義された制限を超えないことを保証します。
検証されるオブジェクトのリミットスコープと、複数化されたモデル名と異なる場合はリミット名を指定しなければなりません。
class ProjectHook
include Limitable
self.limit_name = 'project_hooks' # Optional as ProjectHook corresponds with project_hooks
self.limit_scope = :project
end
モデルをテストするために、共有された例を含めることができます。
it_behaves_like 'includes Limitable concern' do
subject { build(:project_hook, project: create(:project)) }
end
インスタンス全体の制限のテスト
インスタンス全体の機能にはライセンスが割り当てられていないため、インスタンス全体の機能は常にdefault
プランを使用します。
class InstanceVariable
include Limitable
self.limit_name = 'instance_variables' # Optional as InstanceVariable corresponds with instance_variables
self.limit_scope = Limitable::GLOBAL_SCOPE
end
サブスクリプションプラン
opensource
プランは GitLab 14.7 で導入されました。
自己管理型です:
-
default
:みんな
GitLab.
-
default
:システム全体の機能 -
free
:無料サブスクリプションの名前空間とプロジェクト。 -
bronze
:ブロンズサブスクリプションの名前空間とプロジェクト。この階層は購入できなくなりました。 -
silver
:Premiumサブスクリプションの名前空間とプロジェクト。 -
premium
:Premiumサブスクリプションの名前空間とプロジェクト。 -
premium_trial
:Premiumトライアル・サブスクリプションの名前空間とプロジェクト。 -
gold
:Ultimateサブスクリプションの名前空間とプロジェクト。 -
ultimate
:Ultimateサブスクリプションの名前空間とプロジェクト。 -
ultimate_trial
:Ultimateトライアル・サブスクリプションの名前空間とプロジェクト。 -
opensource
:GitLabオープンソースプログラムのメンバーである名前空間とプロジェクト。
test
環境の予定はありません。
レート制限を実装するにはRack::Attack
Rack::Attack
ミドルウェアを使用して Rack リクエストをスロットルします。これはRailsコントローラ、Grapeエンドポイント、その他のRackリクエストに適用されます。
新しいスロットルを追加する手順は以下のようになります:
-
ApplicationSetting
モデル (*_enabled
,*_requests_per_period
,*_period_in_seconds
) に新しいカラムを追加します。 -
Gitlab::RackAttack
とGitlab::RackAttack::Request
を拡張して新しいレート制限を設定し、必要なリクエストに適用します。 -
app/views/admin/application_settings/_ip_limits.html.haml
の Admin Area フォームに新しい設定を追加します。 - ユーザーおよびIPレート制限と アプリケーション設定APIで新しい設定を文書化します。
- GitLab.comのレートリミットを設定し、GitLab.com-specific rate limitsで文書化します。
実装の詳細については、過去のイシューを参照してください:
- Files API用に別のレート制限を作成してください。
- 認証されていないAPIトラフィック用に別のレート制限を作成します。
レート制限を実装するにはGitlab::ApplicationRateLimiter
このモジュールはカスタムレートリミッターを実装しており、特定のアクションを スロットルするために使用できます。ミドルウェアレベルでオペレーションを行うRack::Attack
やRack::Throttle
とは異なり、コントローラや API レベルで使用することができます。
コントローラでの使用についてはCheckRateLimit
を参照してください。コードの他の部分では、Gitlab::ApplicationRateLimiter
モジュールを直接呼び出すことができます。
次のレート制限アーキテクチャ
2022年5月、私たちは前方視的なレート制限アーキテクチャを使用したアプリケーション制限フレームワークの次のイテレーションに着手しました。
新しい要件を定義し、次のアーキテクチャの設計に取り組んでいます。新しい制限を追加するための新しい機能が必要な場合は、今すぐ構築するのではなく、レート制限アーキテクチャ・ワーキンググループに貢献することを検討してください。
レート制限アーキテクチャの次のイテレーションに組み込みたい機能の例:
- 名前空間ごと/プランごとに制限を定義し、上書きできるようにします。
- どのような制限が実装され、デフォルトが何であるかについてのドキュメントを自動的に生成します。
- リミットを一箇所で定義し、検索や探索が可能。
- ソフトリミットとハードリミットがあり、リミットが近づくとユーザーに通知します。