InfoGrab Docs

특정 잡 클래스 처리

요약

이것들은 고급 설정입니다. 대부분의 GitLab 인스턴스는 모든 큐를 수신하는 모든 프로세스를 사용해야 합니다. 다른 대안으로 라우팅 규칙을 사용할 수 있으며, 이는 애플리케이션 내의 특정 잡 클래스를 구성한 큐 이름으로 직접 라우팅합니다.

Warning

이것들은 고급 설정입니다. GitLab.com에서 사용되지만 대부분의 GitLab 인스턴스는 모든 큐를 수신하는 프로세스만 추가해야 합니다. 이것이 참조 아키텍처에 설명된 것과 동일한 접근 방식입니다.

대부분의 GitLab 인스턴스는 모든 큐를 수신하는 모든 프로세스를 사용해야 합니다.

다른 대안으로 라우팅 규칙을 사용할 수 있으며, 이는 애플리케이션 내의 특정 잡 클래스를 구성한 큐 이름으로 직접 라우팅합니다. 그러면 Sidekiq 프로세스는 구성된 큐의 일부만 수신하면 됩니다. 이렇게 하면 Redis의 부하가 줄어들어 대규모 배포에서 중요합니다.

라우팅 규칙#

히스토리
Note

Mailer 잡은 라우팅 규칙으로 라우팅할 수 없으며 항상 mailers 큐로 이동합니다. 라우팅 규칙을 사용할 때 적어도 하나의 프로세스가 mailers 큐를 수신하고 있는지 확인합니다. 일반적으로 이는 default 큐와 함께 배치할 수 있습니다.

Sidekiq 큐를 관리하기 위해 라우팅 규칙을 사용하는 대부분의 GitLab 인스턴스를 권장합니다. 이를 통해 관리자는 속성을 기반으로 잡 클래스 그룹에 대한 단일 큐 이름을 선택할 수 있습니다. 구문은 [query, queue] 쌍의 정렬된 배열입니다:

  1. 쿼리는 워커 일치 쿼리입니다.
  2. 큐 이름은 유효한 Sidekiq 큐 이름이어야 합니다. 큐 이름이 nil이거나 빈 문자열이면 워커는 워커 이름으로 생성된 큐로 라우팅됩니다. (자세한 내용은 사용 가능한 잡 클래스 목록 참조). 큐 이름은 사용 가능한 잡 클래스 목록의 기존 큐 이름과 일치하지 않아도 됩니다.
  3. 워커와 일치하는 첫 번째 쿼리가 해당 워커에 선택되며, 이후 규칙은 무시됩니다.

라우팅 규칙 마이그레이션#

Sidekiq 라우팅 규칙이 변경된 후, 특히 잡 큐가 긴 시스템에서 잡을 완전히 잃지 않도록 마이그레이션에 주의를 기울여야 합니다. 마이그레이션은 Sidekiq 잡 마이그레이션에서 언급한 마이그레이션 단계를 따라 수행할 수 있습니다.

스케일링된 아키텍처에서의 라우팅 규칙#

라우팅 규칙은 애플리케이션 구성의 일부이므로 모든 GitLab 노드(특히 GitLab Rails 및 Sidekiq 노드)에서 동일해야 합니다.

상세 예시#

이것은 다양한 가능성을 보여주기 위한 포괄적인 예시입니다. Helm 차트 예시도 사용 가능합니다. 이것들은 권장 사항이 아닙니다.

  1. /etc/gitlab/gitlab.rb를 편집합니다:

    sidekiq['routing_rules'] = [
      # Route all non-CPU-bound workers that are high urgency to `high-urgency` queue
      ['resource_boundary!=cpu&urgency=high', 'high-urgency'],
      # Route all database, gitaly and global search workers that are throttled to `throttled` queue
      ['feature_category=database,gitaly,global_search&urgency=throttled', 'throttled'],
      # Route all workers having contact with outside world to a `network-intenstive` queue
      ['has_external_dependencies=true|feature_category=hooks|tags=network', 'network-intensive'],
      # Wildcard matching, route the rest to `default` queue
      ['*', 'default']
    ]
    

    queue_groups는 이러한 생성된 큐 이름과 일치하도록 설정할 수 있습니다. 예를 들어:

    sidekiq['queue_groups'] = [
      # Run two high-urgency processes
      'high-urgency',
      'high-urgency',
      # Run one process for throttled, network-intensive
      'throttled,network-intensive',
      # Run one 'catchall' process on the default and mailers queues
      'default,mailers'
    ]
    
  2. 파일을 저장하고 GitLab을 재구성합니다:

    sudo gitlab-ctl reconfigure
    

워커 일치 쿼리#

GitLab은 라우팅 규칙에서 사용하는 속성을 기반으로 워커를 일치시키는 쿼리 구문을 제공합니다. 쿼리는 두 가지 구성 요소로 이루어집니다:

  • 선택할 수 있는 속성.
  • 쿼리를 구성하는 데 사용되는 연산자.

사용 가능한 속성#

큐 일치 쿼리는 GitLab 개발 문서의 Sidekiq 스타일 가이드에 설명된 워커 속성을 기반으로 작동합니다. 워커 속성의 일부를 기반으로 쿼리를 지원합니다:

  • feature_category - 큐가 속하는 GitLab 기능 카테고리. 예를 들어, merge 큐는 source_code_management 카테고리에 속합니다.
  • has_external_dependencies - 큐가 외부 서비스에 연결하는지 여부. 예를 들어, 모든 임포터는 이것이 true로 설정되어 있습니다.
  • urgency - 이 큐의 잡이 빨리 실행되는 것이 얼마나 중요한지. high, low, 또는 throttled일 수 있습니다. 예를 들어, authorized_projects 큐는 사용자 권한을 새로 고치는 데 사용되며 high 긴급도입니다.
  • worker_name - 워커 이름. 특정 워커를 선택하려면 이 속성을 사용합니다. 아래 잡 클래스 목록에서 모든 사용 가능한 이름을 찾습니다.
  • name - 워커 이름으로 생성된 큐 이름. 특정 큐를 선택하려면 이 속성을 사용합니다. 이것은 워커 이름으로 생성되므로 다른 라우팅 규칙의 결과에 따라 변경되지 않습니다.
  • resource_boundary - 큐가 cpu, memory 또는 unknown에 의해 제한되는지 여부. 예를 들어, ProjectExportWorker는 내보내기 전에 메모리에 데이터를 로드해야 하므로 메모리에 의해 제한됩니다.
  • tags - 큐의 단기 주석. 이것들은 릴리스에서 릴리스로 자주 변경될 것으로 예상되며 완전히 제거될 수도 있습니다.
  • queue_namespace - 일부 워커는 네임스페이스로 그룹화되어 있으며, name<queue_namespace>:로 접두사가 붙습니다. 예를 들어, cronjob:admin_email의 큐 name의 경우 queue_namespacecronjob입니다. 워커 그룹을 선택하려면 이 속성을 사용합니다.

has_external_dependencies는 불리언 속성입니다: 정확한 문자열 true만 true로 간주되고, 다른 모든 것은 false로 간주됩니다.

tags는 집합으로, =는 교집합을 확인하고 !=는 서로소 집합을 확인합니다. 예를 들어, tags=a,ba, b 또는 둘 다의 태그가 있는 큐를 선택합니다. tags!=a,b는 해당 태그 중 하나도 없는 큐를 선택합니다.

사용 가능한 연산자#

라우팅 규칙은 우선순위가 높은 것부터 낮은 것 순으로 나열된 다음 연산자를 지원합니다:

  • | - 논리 OR 연산자. 예를 들어, query_a|query_b(여기서 query_aquery_b는 다른 연산자로 구성된 쿼리)는 두 쿼리 중 하나와 일치하는 큐를 포함합니다.
  • & - 논리 AND 연산자. 예를 들어, query_a&query_b(여기서 query_aquery_b는 다른 연산자로 구성된 쿼리)는 두 쿼리 모두와 일치하는 큐만 포함합니다.
  • != - NOT IN 연산자. 예를 들어, feature_category!=issue_trackingissue_tracking 기능 카테고리의 모든 큐를 제외합니다.
  • = - IN 연산자. 예를 들어, resource_boundary=cpu는 CPU에 의해 제한되는 모든 큐를 포함합니다.
  • , - 집합 연결 연산자. 예를 들어, feature_category=continuous_integration,pagescontinuous_integration 카테고리 또는 pages 카테고리의 모든 큐를 포함합니다. 이 예시는 OR 연산자를 사용하여도 가능하지만 더 간결하며 우선순위가 낮습니다.

이 구문의 연산자 우선순위는 고정되어 있습니다: ANDOR보다 높은 우선순위를 갖도록 만들 수 없습니다.

전체 큐 그룹으로 단일 *를 사용하면 이전에 문서화된 표준 큐 그룹 구문과 마찬가지로 모든 큐가 선택됩니다.

Rails 콘솔에서 라우팅 규칙 테스트#

Rails 콘솔에서 다음을 실행하여 특정 쿼리와 일치하는 워커를 확인할 수 있습니다:

matcher = Gitlab::SidekiqConfig::WorkerMatcher.new("feature_category=global_search")
Gitlab::SidekiqConfig.workers
  .select { |w| matcher.match?(w.to_yaml) }
  .map(&:klass)

쿼리 문자열을 유효한 워커 일치 쿼리로 대체하여 다양한 라우팅 규칙을 테스트합니다.

다양한 쿼리 파라미터를 찾으려면 사용 가능한 잡 클래스 목록을 참조합니다.

사용 가능한 잡 클래스 목록#

기존 Sidekiq 잡 클래스 및 큐 목록은 다음 파일을 확인합니다:

특정 잡 클래스 처리

원문 보기
요약

이것들은 고급 설정입니다. 대부분의 GitLab 인스턴스는 모든 큐를 수신하는 모든 프로세스를 사용해야 합니다. 다른 대안으로 라우팅 규칙을 사용할 수 있으며, 이는 애플리케이션 내의 특정 잡 클래스를 구성한 큐 이름으로 직접 라우팅합니다.

Warning

이것들은 고급 설정입니다. GitLab.com에서 사용되지만 대부분의 GitLab 인스턴스는 모든 큐를 수신하는 프로세스만 추가해야 합니다. 이것이 참조 아키텍처에 설명된 것과 동일한 접근 방식입니다.

대부분의 GitLab 인스턴스는 모든 큐를 수신하는 모든 프로세스를 사용해야 합니다.

다른 대안으로 라우팅 규칙을 사용할 수 있으며, 이는 애플리케이션 내의 특정 잡 클래스를 구성한 큐 이름으로 직접 라우팅합니다. 그러면 Sidekiq 프로세스는 구성된 큐의 일부만 수신하면 됩니다. 이렇게 하면 Redis의 부하가 줄어들어 대규모 배포에서 중요합니다.

라우팅 규칙#

히스토리
Note

Mailer 잡은 라우팅 규칙으로 라우팅할 수 없으며 항상 mailers 큐로 이동합니다. 라우팅 규칙을 사용할 때 적어도 하나의 프로세스가 mailers 큐를 수신하고 있는지 확인합니다. 일반적으로 이는 default 큐와 함께 배치할 수 있습니다.

Sidekiq 큐를 관리하기 위해 라우팅 규칙을 사용하는 대부분의 GitLab 인스턴스를 권장합니다. 이를 통해 관리자는 속성을 기반으로 잡 클래스 그룹에 대한 단일 큐 이름을 선택할 수 있습니다. 구문은 [query, queue] 쌍의 정렬된 배열입니다:

  1. 쿼리는 워커 일치 쿼리입니다.
  2. 큐 이름은 유효한 Sidekiq 큐 이름이어야 합니다. 큐 이름이 nil이거나 빈 문자열이면 워커는 워커 이름으로 생성된 큐로 라우팅됩니다. (자세한 내용은 사용 가능한 잡 클래스 목록 참조). 큐 이름은 사용 가능한 잡 클래스 목록의 기존 큐 이름과 일치하지 않아도 됩니다.
  3. 워커와 일치하는 첫 번째 쿼리가 해당 워커에 선택되며, 이후 규칙은 무시됩니다.

라우팅 규칙 마이그레이션#

Sidekiq 라우팅 규칙이 변경된 후, 특히 잡 큐가 긴 시스템에서 잡을 완전히 잃지 않도록 마이그레이션에 주의를 기울여야 합니다. 마이그레이션은 Sidekiq 잡 마이그레이션에서 언급한 마이그레이션 단계를 따라 수행할 수 있습니다.

스케일링된 아키텍처에서의 라우팅 규칙#

라우팅 규칙은 애플리케이션 구성의 일부이므로 모든 GitLab 노드(특히 GitLab Rails 및 Sidekiq 노드)에서 동일해야 합니다.

상세 예시#

이것은 다양한 가능성을 보여주기 위한 포괄적인 예시입니다. Helm 차트 예시도 사용 가능합니다. 이것들은 권장 사항이 아닙니다.

  1. /etc/gitlab/gitlab.rb를 편집합니다:

    sidekiq['routing_rules'] = [
      # Route all non-CPU-bound workers that are high urgency to `high-urgency` queue
      ['resource_boundary!=cpu&urgency=high', 'high-urgency'],
      # Route all database, gitaly and global search workers that are throttled to `throttled` queue
      ['feature_category=database,gitaly,global_search&urgency=throttled', 'throttled'],
      # Route all workers having contact with outside world to a `network-intenstive` queue
      ['has_external_dependencies=true|feature_category=hooks|tags=network', 'network-intensive'],
      # Wildcard matching, route the rest to `default` queue
      ['*', 'default']
    ]
    

    queue_groups는 이러한 생성된 큐 이름과 일치하도록 설정할 수 있습니다. 예를 들어:

    sidekiq['queue_groups'] = [
      # Run two high-urgency processes
      'high-urgency',
      'high-urgency',
      # Run one process for throttled, network-intensive
      'throttled,network-intensive',
      # Run one 'catchall' process on the default and mailers queues
      'default,mailers'
    ]
    
  2. 파일을 저장하고 GitLab을 재구성합니다:

    sudo gitlab-ctl reconfigure
    

워커 일치 쿼리#

GitLab은 라우팅 규칙에서 사용하는 속성을 기반으로 워커를 일치시키는 쿼리 구문을 제공합니다. 쿼리는 두 가지 구성 요소로 이루어집니다:

  • 선택할 수 있는 속성.
  • 쿼리를 구성하는 데 사용되는 연산자.

사용 가능한 속성#

큐 일치 쿼리는 GitLab 개발 문서의 Sidekiq 스타일 가이드에 설명된 워커 속성을 기반으로 작동합니다. 워커 속성의 일부를 기반으로 쿼리를 지원합니다:

  • feature_category - 큐가 속하는 GitLab 기능 카테고리. 예를 들어, merge 큐는 source_code_management 카테고리에 속합니다.
  • has_external_dependencies - 큐가 외부 서비스에 연결하는지 여부. 예를 들어, 모든 임포터는 이것이 true로 설정되어 있습니다.
  • urgency - 이 큐의 잡이 빨리 실행되는 것이 얼마나 중요한지. high, low, 또는 throttled일 수 있습니다. 예를 들어, authorized_projects 큐는 사용자 권한을 새로 고치는 데 사용되며 high 긴급도입니다.
  • worker_name - 워커 이름. 특정 워커를 선택하려면 이 속성을 사용합니다. 아래 잡 클래스 목록에서 모든 사용 가능한 이름을 찾습니다.
  • name - 워커 이름으로 생성된 큐 이름. 특정 큐를 선택하려면 이 속성을 사용합니다. 이것은 워커 이름으로 생성되므로 다른 라우팅 규칙의 결과에 따라 변경되지 않습니다.
  • resource_boundary - 큐가 cpu, memory 또는 unknown에 의해 제한되는지 여부. 예를 들어, ProjectExportWorker는 내보내기 전에 메모리에 데이터를 로드해야 하므로 메모리에 의해 제한됩니다.
  • tags - 큐의 단기 주석. 이것들은 릴리스에서 릴리스로 자주 변경될 것으로 예상되며 완전히 제거될 수도 있습니다.
  • queue_namespace - 일부 워커는 네임스페이스로 그룹화되어 있으며, name<queue_namespace>:로 접두사가 붙습니다. 예를 들어, cronjob:admin_email의 큐 name의 경우 queue_namespacecronjob입니다. 워커 그룹을 선택하려면 이 속성을 사용합니다.

has_external_dependencies는 불리언 속성입니다: 정확한 문자열 true만 true로 간주되고, 다른 모든 것은 false로 간주됩니다.

tags는 집합으로, =는 교집합을 확인하고 !=는 서로소 집합을 확인합니다. 예를 들어, tags=a,ba, b 또는 둘 다의 태그가 있는 큐를 선택합니다. tags!=a,b는 해당 태그 중 하나도 없는 큐를 선택합니다.

사용 가능한 연산자#

라우팅 규칙은 우선순위가 높은 것부터 낮은 것 순으로 나열된 다음 연산자를 지원합니다:

  • | - 논리 OR 연산자. 예를 들어, query_a|query_b(여기서 query_aquery_b는 다른 연산자로 구성된 쿼리)는 두 쿼리 중 하나와 일치하는 큐를 포함합니다.
  • & - 논리 AND 연산자. 예를 들어, query_a&query_b(여기서 query_aquery_b는 다른 연산자로 구성된 쿼리)는 두 쿼리 모두와 일치하는 큐만 포함합니다.
  • != - NOT IN 연산자. 예를 들어, feature_category!=issue_trackingissue_tracking 기능 카테고리의 모든 큐를 제외합니다.
  • = - IN 연산자. 예를 들어, resource_boundary=cpu는 CPU에 의해 제한되는 모든 큐를 포함합니다.
  • , - 집합 연결 연산자. 예를 들어, feature_category=continuous_integration,pagescontinuous_integration 카테고리 또는 pages 카테고리의 모든 큐를 포함합니다. 이 예시는 OR 연산자를 사용하여도 가능하지만 더 간결하며 우선순위가 낮습니다.

이 구문의 연산자 우선순위는 고정되어 있습니다: ANDOR보다 높은 우선순위를 갖도록 만들 수 없습니다.

전체 큐 그룹으로 단일 *를 사용하면 이전에 문서화된 표준 큐 그룹 구문과 마찬가지로 모든 큐가 선택됩니다.

Rails 콘솔에서 라우팅 규칙 테스트#

Rails 콘솔에서 다음을 실행하여 특정 쿼리와 일치하는 워커를 확인할 수 있습니다:

matcher = Gitlab::SidekiqConfig::WorkerMatcher.new("feature_category=global_search")
Gitlab::SidekiqConfig.workers
  .select { |w| matcher.match?(w.to_yaml) }
  .map(&:klass)

쿼리 문자열을 유효한 워커 일치 쿼리로 대체하여 다양한 라우팅 규칙을 테스트합니다.

다양한 쿼리 파라미터를 찾으려면 사용 가능한 잡 클래스 목록을 참조합니다.

사용 가능한 잡 클래스 목록#

기존 Sidekiq 잡 클래스 및 큐 목록은 다음 파일을 확인합니다: