어플리케이션 제한 개발
이 문서는 GitLab에 어플리케이션 제한을 추가하기 위한 기여자를 위한 개발 가이드를 제공합니다.
문서
우선, 다양한 GitLab 티어에 설정된 다른 제한을 수집하고 결정해야 합니다. 문서화를 위해 다른 사람들과 협력하세요.
introducing application limits에 대한 가이드가 있습니다.
계획 제한 구현
데이터베이스 계획 제한 삽입
plan_limits
테이블에 새 열을 만들고 제한 값을 삽입합니다. 두 개의 별도의 마이그레이션 스크립트 파일을 만드는 것이 좋습니다.
-
원하는 제한을 나타내는 기본값이 설정된 새 열을
plan_limits
테이블에 추가하세요. 예를 들어:add_column(:plan_limits, :project_hooks, :integer, default: 100, null: false)
제한이
0
으로 설정된plan_limits
항목은 제한이 활성화되지 않았음을 의미합니다. 이 설정은 특별한 경우와 문서화된 상황에만 사용해야 합니다. -
(옵션) 원하는 제한을 각 레벨에 맞게 세밀하게 조정하는 데이터베이스 마이그레이션을 만들고, 예를 들어
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?
메서드가 있습니다. ActiveRecord
객체나 Integer
중 하나를 사용할 수 있습니다.
레코드의 개수가 정의된 제한을 초과하지 않도록 보장합니다. 예를 들어:
project.actual_limits.exceeded?(:project_hooks, ProjectHook.where(project: project))
숫자가 정의된 제한을 초과하지 않도록 보장합니다. 예를 들어:
project.actual_limits.exceeded?(:project_hooks, 10)
Limitable
관련
Limitable
관련은 모델이 제한을 초과하지 않도록 검증하는 데 사용될 수 있습니다. 현재 모델에 대한 레코드 수가 정의된 제한을 초과하지 않도록 보장합니다.
검증되는 객체의 제한 범위와 복수형 모델 이름과 다른 경우 제한 이름을 지정해야 합니다.
class ProjectHook
include Limitable
self.limit_name = 'project_hooks' # 선택 사항, ProjectHook은 project_hooks와 대응합니다.
self.limit_scope = :project
end
모델을 테스트하기 위해 공유 예제를 포함할 수 있습니다.
it_behaves_like 'includes Limitable concern' do
subject { build(:project_hook, project: create(:project)) }
end
인스턴스 전체 제한 테스트
인스턴스 전체 기능은 항상 default
Plan을 사용합니다. 인스턴스 전체 기능에는 라이선스가 할당되지 않습니다.
class InstanceVariable
include Limitable
self.limit_name = 'instance_variables' # 선택 사항, InstanceVariable은 instance_variables와 대응합니다.
self.limit_scope = Limitable::GLOBAL_SCOPE
end
구독 플랜
opensource
플랜은 GitLab 14.7에서 소개되었습니다.
자체 관리:
-
default
: 모두.
GitLab.com:
-
default
: 시스템 전체 기능. -
free
: 무료 구독이 있는 네임스페이스 및 프로젝트. -
bronze
: 브론즈 구독이 있는 네임스페이스 및 프로젝트. 이 티어는 더 이상 구입할 수 없습니다. -
silver
: 프리미엄 구독이 있는 네임스페이스 및 프로젝트. -
premium
: 프리미엄 구독이 있는 네임스페이스 및 프로젝트. -
premium_trial
: 프리미엄 체험 구독이 있는 네임스페이스 및 프로젝트. -
gold
: 얼티메이트 구독이 있는 네임스페이스 및 프로젝트. -
ultimate
: 얼티메이트 구독이 있는 네임스페이스 및 프로젝트. -
ultimate_trial
: 얼티메이트 체험 구독이 있는 네임스페이스 및 프로젝트. -
opensource
: GitLab 오픈 소스 프로그램에 속한 네임스페이스 및 프로젝트.
test
환경에는 플랜이 없습니다.
Rack::Attack
를 사용하여 속도 제한 구현
우리는 Rack::Attack
미들웨어를 사용하여 Rack 요청을 제한합니다. 이는 Rails 컨트롤러, Grape 엔드포인트 및 기타 모든 Rack 요청에 적용됩니다.
새로운 속도 제한을 추가하는 프로세스는 대략 다음과 같습니다:
-
ApplicationSetting
모델의 rate_limits JSONB 열에 새로운 필드를 추가합니다. - rate_limits 열에 대한 JSON 스키마 검증기를 업데이트합니다.
-
Gitlab::RackAttack
및Gitlab::RackAttack::Request
를 확장하여 새로운 속도 제한을 구성하고 원하는 요청에 적용합니다. -
app/views/admin/application_settings/_ip_limits.html.haml
의 관리자 영역 양식에 새로운 설정을 추가합니다. - User and IP rate limits 및 Application settings API에서 새로운 설정을 문서화합니다.
- GitLab.com에 대한 속도 제한을 구성하고 GitLab.com-specific rate limits에서 문서화합니다.
구현 세부 정보에 대해서는 이전 이슈를 참조하십시오:
Gitlab::ApplicationRateLimiter
를 사용하여 속도 제한 구현
이 모듈은 특정 작업을 제한할 수 있는 사용자 지정 속도 제한기를 구현합니다. 미들웨어 수준에서 작동하는 Rack::Attack
및 Rack::Throttle
과 달리 이 모듈은 컨트롤러 또는 API 수준에서 사용할 수 있습니다.
컨트롤러에서 사용할 수 있는 CheckRateLimit
concern을 참조하십시오. 코드의 다른 부분에서는 Gitlab::ApplicationRateLimiter
모듈을 직접 호출할 수 있습니다.
다음 속도 제한 아키텍처
2022년 5월부터 우리는 전방을 바라본 속도 제한 아키텍처를 사용하여 애플리케이션 제한 프레임워크의 다음 이터레이션에 대해 작업을 시작했습니다.
우리는 새로운 요구 사항을 정의하고 다음 아키텍처를 설계하는 작업을 진행 중이므로 새로운 제한을 추가해야 할 필요가 있을 경우, 지금 즉시 구축하는 대신 속도 제한 아키텍처 워킹 그룹에 기여할 것을 고려하십시오.
다음 이터레이션의 속도 제한 아키텍처에 포함하고자 하는 기능 예시:
- 네임스페이스/플랜별 제한을 정의하고 재정의할 수 있게 만들기
- 구현된 제한 및 기본값에 대한 문서 자동 생성
- 찾을 수 있고 탐색할 수 있는 한 곳에서 제한 정의
- 제한에 접근할 때 사용자에게 알림을 보내도록 지원하는 소프트 및 하드 제한