애플리케이션은 개발을 제한합니다

이 문서는 GitLab에 애플리케이션 제한을 추가하려는 기여자들을 위한 개발 가이드를 제공합니다.

문서

우선, 다양한 GitLab 티어에 대한 다양한 제한을 설정해야 할 정보를 수집하고 결정해야 합니다. 문서화를 위해 다른 사람들과 협의하세요.

애플리케이션 제한을 소개하는 가이드가 있습니다.

계획 제한 구현

데이터베이스 계획 제한 추가

plan_limits 테이블에서 새 열을 만들고 제한 값을 삽입하세요. 두 개의 별도 마이그레이션 스크립트 파일을 만드는 것이 좋습니다.

  1. plan_limits 테이블에 새 열을 추가하고 원하는 제한을 나타내는 기본값이 있는 열을 추가하세요. 예시:

    add_column(:plan_limits, :project_hooks, :integer, default: 100, null: false)
    

    제한이 0으로 설정된 계획 제한 항목은 제한이 활성화되지 않았음을 의미합니다. 이 설정은 특별하고 문서화된 경우에만 사용해야 합니다.

  2. (선택 사항) 각 레벨을 원하는 제한으로 세밀하게 조정하는 데이터베이스 마이그레이션을 만드세요. 예시:

    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에서만 존재합니다. 이것은 존재하지 않는 계획에 대해 no-op입니다.

계획 제한 유효성 검사

현재 제한 가져오기

프로젝트나 네임스페이스를 통해 현재 제한에 액세스할 수 있습니다. 예시:

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

구독 플랜

Self-managed:

  • default: 모두.

GitLab.com:

  • 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 요청에 적용됩니다.

새로운 쓰로틀을 추가하는 프로세스는 다음과 같이 진행됩니다:

  1. ApplicationSetting 모델의 rate_limits JSONB 열에 새 필드를 추가합니다.
  2. rate_limits 열의 JSON 스키마 검증기를 업데이트합니다.
  3. Gitlab::RackAttackGitlab::RackAttack::Request를 확장하여 새 요금 제한을 구성하고 원하는 요청에 적용합니다.
  4. app/views/admin/application_settings/_ip_limits.html.haml의 Admin Area 양식에 새로운 설정을 추가합니다.
  5. 사용자 및 IP 요금 제한Application settings API에 새로운 설정을 문서화합니다.
  6. GitLab.com용 요금 제한을 구성하고 GitLab.com 특정 요금 제한에 문서화합니다.

구현 세부 정보는 다음과 같은 과거 이슈를 참조하세요:

Gitlab::ApplicationRateLimiter를 사용하여 요율 제한 구현

이 모듈은 특정 작업을 스로틀할 수 있는 사용자 정의 요율 제한기를 구현합니다. Rack::AttackRack::Throttle와 달리 미들웨어 수준에서 작동하는 것이 아니라 컨트롤러나 API 수준에서 사용할 수 있습니다.

컨트롤러에서 사용하려면 CheckRateLimit concern을 참조하십시오. 코드의 다른 부분에서는 Gitlab::ApplicationRateLimiter 모듈을 직접 호출할 수 있습니다.

다음 요율 제한 아키텍처

2022년 5월, 우리는 전방적인 요율 제한 아키텍처를 사용하여 애플리케이션의 다음 이터레이션에 대해 작업을 시작했습니다.

새로운 요구 사항을 정의하고 다음 아키텍처를 설계 중이므로 새로운 제한을 추가해야 하는 경우 이를 지금 바로 작성하는 대신에 Rate Limiting Architecture Working Group에 기여하는 것을 고려해주시기 바랍니다.

다음 이터레이션의 요율 제한 아키텍처에 구축하고자 하는 기능 예시:

  1. 네임스페이스/플랜별로 제한 정의 및 재정의하는 기능을 추가하는 것.
  2. 구현된 제한 및 기본 설정에 대한 문서 자동 생성 기능.
  3. 찾아볼 수 있고 탐구할 수 있는 단일 위치에서 제한 정의.
  4. 한계 도달 시 사용자에게 알림을 지원하는 소프트 및 하드 제한.