GitLab Workhorse

GitLab Workhorse는 리소스 집약적이고 오랜 시간 동안 실행되는 요청을 처리하기 위해 설계된 GitLab의 스마트한 리버스 프록시입니다. Puma 앞에 위치하여 GitLab Rails로부터 나가는 모든 HTTP 요청을 가로채고 처리합니다. Rails는 요청을 Workhorse로 위임하고, 파일 다운로드 및 업로드, HTTP 푸시/풀 및 HTTP 아카이브 다운로드와 같은 리소스 집약적인 HTTP 요청을 담당하여 리소스 활용을 최적화하고 요청 처리 효율성을 향상시킵니다.

GitLab 스택 내의 역할

Workhorse는 앞에 다른 리버스 프록시 서버가 있을 수 있지만 오직 NGINX만 지원됩니다. 또한 소스에서 GitLab를 설치할 때 Apache와 같은 다른 리버스 프록시를 사용하는 것도 가능합니다(비공식 지원). gitlab.com과 같은 다수의 GitLab 인스턴스에서 NGINX 앞에 CloudFlare와 같은 CDN이 위치합니다.

모든 Rails 컨트롤러와 HTTP 요청 처리 및 HTTP 응답 반환하는 코드는 모두 GitLab Workhorse를 통해 프록시됩니다. 대부분의 리버스 프록시가 일반적인 반면, Workhorse는 GitLab Rails와 매우 밀접하게 연결되어 있습니다. 필요한 경우, Workhorse는 HTTP 헤더를 수정하여 GitLab Rails가 효율적으로 작업을 완료할 수 있도록 합니다.

기능 및 운영

요청 처리

  • Workhorse는 주로 들어오는 요청을 뒷받침하여 처리하기 위한 역할을 하며, 이를 처리하기 위해 Rails로 전달합니다. 본질적으로 대부분의 요청에는 최소한의 개입만을 하여 요청 처리 파이프라인을 간소화하는 역할을 합니다.
  • 특정 유형의 요청, 특히 리소스 집약적이거나 특수 처리가 필요한 요청(예: 대용량 파일 업로드)의 경우, Workhorse는 보다 적극적인 역할을 합니다. Rails로부터 지시를받으면, Workhorse는 Gitaly와 직접 상호 작용하거나 파일 업로드 처리를 Rails로부터 분리하는 등 특수 작업을 수행합니다.

특수 작업 처리

  • Workhorse는 Rails의 응답에 기반하여 특정 요청을 가로채고 미리 정의된 작업을 실행할 수 있습니다. 이는 Gitaly와 상호 작용, 대용량 데이터 블롭 관리, 그리고 요청 처리 로직 변경 등을 포함합니다.
  • 주목할만한 기능은 파일 업로드를 효율적으로 관리할 수 있는 능력입니다. Workhorse는 파일 업로드 프로세스를 가로채어 Rails에서 지시한 작업(예: 파일 일시적으로 저장 또는 객체 리포지터리로 파일 업로드)을 수행하고 프로세스가 완료되었음을 Rails에 알립니다.

Rails API와의 통합

Workhorse는 컨테이너 레지스트리 서비스와 상호 작용이 필요한 상황에서 특히 Rails API의 프록시로 작동합니다. 이러한 설정은 Workhorse의 능력을 보여주며 리버스 프록시로써 고부하 서비스를 처리할 수 있는 능력을 보여줍니다.

아키텍처적 고려 사항

기능 확장

  • 단숨함 유지: Workhorse의 기능을 확장하여 특정 서비스를 직접 처리할 때(예: 컨테이너 레지스트리)에도 단숨함과 효율성을 유지하는 것이 중요합니다. Workhorse는 복잡한 제어 로직을 포함해서는 안 되고 대신에 Rails에서 지시된 대로 작업을 실행하는 데 집중해야 합니다.
  • 서비스 구현 및 데이터 이전: Workhorse에 새로운 기능을 구현하는 데에는 데이터 이전 전략과 서비스 연속성에 대한 신중한 고려가 필요합니다.

데이터 관리 및 운영적 무결성

Workhorse의 아키텍처는 가비지 수집 및 데이터 이전을 포함한 효율적인 데이터 관리 전략을 용이하게 해줍니다. Workhorse의 역할은 복잡한 데이터 조작이나 제어 로직에 직접적으로 개입하지 않고 Rails의 영역으로 남겨두고 높은 성능의 작업을 지원하는 데 있습니다. 배경 처리나 오랜 시간 동안 실행되는 작업이 필요한 경우, 별도의 서비스나 Sidekiq 작업 큐를 사용하여 작업 실행 및 데이터 무결성을 관리하는 데 Workhorse와 Rails이 협조하는 것이 좋습니다.

Workhorse는 Rails 모로리포의 서브폴더에 있으며 gitlab-org/gitlab/workhorse에서 찾을 수 있습니다.

학습 리소스

Workhorse 설치

GitLab Workhorse를 설치하려면 Go 1.18 이상GNU Make가 필요합니다.

/usr/local/bin에 설치하려면 make install을 실행하세요.

make install

/foo/bin에 설치하려면 PREFIX 변수를 설정하세요.

make install PREFIX=/foo

FreeBSD와 같은 일부 운영 체제에서는 gmake 대신 make를 사용해야 할 수도 있습니다.

참고: 일부 기능은 빌드 태그에 종속되므로 활성화하려면 Workhorse 구성을 확인하세요.

런타임 의존성

Workhorse는 업로드된 이미지에서 민감한 정보가 포함될 수 있는 EXIF 데이터를 제거하기 위해 ExifTool을 사용합니다. 만약 GitLab을 설치했다면:

  • Linux 패키지를 사용하는 경우 설정이 완료됩니다. CentOS Minimal을 사용하는 경우 yum install perl 명령으로 perl 패키지를 설치해야 합니다.
  • 소스에서 설치한 경우 exiftool이 설치되었는지 확인하세요.

    # Debian/Ubuntu
    sudo apt-get install libimage-exiftool-perl
      
    # RHEL/CentOS
    sudo yum install perl-Image-ExifTool
    

코드 테스트

다음 명령을 사용하여 테스트를 실행하세요.

make clean test

GitLab Workhorse의 각 기능은 해당 기능이 올바르게 작동하는지 확인하는 통합 테스트가 있어야 합니다. 특정 동작에 대한 패키지 수준의 테스트가 있는 것이 좋지만, 개발 중에는 고수준의 통합 테스트가 우선시되어야 합니다.

한 기능이 통합 테스트만으로 커버되어 있는 것도 괜찮습니다.