GitLab Workhorse

GitLab Workhorse는 리소스가 많이 소모되고 긴 요청을 처리하기 위해 설계된 스마트 리버스 프록시입니다.

이 프록시는 Puma 앞에 위치하며 GitLab Rails로 향하는 모든 HTTP 요청을 가로챕니다.

Rails는 요청을 Workhorse에 위임하고, Workhorse는 파일 다운로드 및 업로드, git의 HTTP 푸시/풀 및 git의 HTTP 아카이브 다운로드와 같은 리소스 집약적인 HTTP 요청을 처리하는 책임을 집니다.

이를 통해 리소스 활용을 최적화하고 요청 처리 효율성을 개선합니다.

GitLab 스택에서의 역할

Workhorse 앞에 다른 리버스 프록시 서버를 두는 것이 가능하지만 NGINX만 지원됩니다.

GitLab을 소스에서 설치할 때 Apache와 같은 다른 리버스 프록시를 사용하는 것은 가능하지만 지원되지 않습니다.

gitlab.com과 같은 많은 GitLab 인스턴스에서는 CloudFlare와 같은 CDN이 NGINX 앞에 위치합니다.

모든 Rails 컨트롤러 및 HTTP 요청을 처리하고 HTTP 응답을 반환하는 다른 코드는 GitLab Workhorse를 통해 프록시됩니다.

Workhorse는 다른 리버스 프록시와는 다르게 GitLab Rails에 매우 밀접하게 연결되어 있으며, 대부분의 리버스 프록시는 꽤 일반적입니다.

필요할 때 Workhorse는 GitLab Rails가 작업을 효율적으로 오프로드하는 데 의존하는 HTTP 헤더를 수정합니다.

기능 및 운영

요청 처리

  • Workhorse는 주로 요청을 받아 Rails로 전달하는 패스스루 엔티티로 작용합니다.

    본질적으로 대부분의 요청에 대해 최소한의 개입을 수행하여 요청 처리 파이프라인을 간소화합니다.

  • 특정 유형의 요청, 특히 리소스 집약적이거나 전문적인 처리가 필요한 요청(예: 큰 파일 업로드)의 경우, Workhorse가 더 적극적인 역할을 합니다.

    Rails로부터 지시를 받으면 Workhorse는 Gitaly와 직접 상호작용하거나 파일 업로드 처리를 Rails에서 오프로드하는 등의 전문 작업을 수행합니다.

전문 작업 처리

  • Workhorse는 Rails의 응답에 따라 특정 요청을 가로채고 미리 정의된 작업을 실행할 수 있습니다.

    여기에는 Gitaly와 상호작용하거나 대용량 데이터 블롭을 관리하고 요청 처리 로직을 필요에 따라 변경하는 작업이 포함됩니다.

  • 주목할 만한 기능은 파일 업로드를 효율적으로 관리하는 능력입니다.

    Workhorse는 파일 업로드 프로세스를 탈취하여 Rails가 지시하는 대로 필요한 작업(예: 파일을 임시로 저장하거나 객체 저장소에 업로드)을 수행하고, 프로세스가 완료되면 Rails에 업데이트합니다.

Rails API와의 통합

Workhorse는 특히 컨테이너 레지스트리 서비스와의 상호작용을 필요로 하는 컨텍스트에서 Rails API에 대한 프록시 역할을 합니다.

이 설정은 Workhorse가 리버스 프록시 역할을 하여 Rails에 대한 직접적인 부하를 최소화함으로써 고부하 서비스를 처리할 수 있는 능력을 보여줍니다.

아키텍처적 고려사항

기능 확장

  • 단순성 유지: Workhorse의 기능을 확장하여 특정 서비스(예: 컨테이너 레지스트리)의 직접 처리를 포함시키는 경우, 그 단순성과 효율성을 유지하는 것이 중요합니다.

    Workhorse는 복잡한 제어 로직을 포함하지 말고 Rails가 지시하는 대로 작업을 수행하는 데 집중해야 합니다.

  • 서비스 구현 및 데이터 마이그레이션: Workhorse에 새 기능을 구현하려면 데이터 마이그레이션 전략 및 서비스 연속성에 대한 신중한 고려가 필요합니다.

데이터 관리 및 운영 무결성

  • Workhorse의 아키텍처는 효율적인 데이터 관리 전략을 촉진하며, 여기에는 가비지 수집 및 데이터 마이그레이션이 포함됩니다.

    Workhorse의 역할은 복잡한 데이터 조작이나 제어 로직을 직접 포함하지 않고 고성능 작업을 지원하는 것입니다. 이는 Rails의 범위에 해당합니다.

  • 백그라운드 처리나 긴 작업을 요구하는 작업에는 별도의 서비스나 Sidekiq 작업 큐를 사용하는 것이 좋으며, Workhorse와 Rails는 작업 실행 및 데이터 무결성을 관리하기 위해 협력해야 합니다.

Workhorse는 Rails 모노레포의 서브폴더에 포함되어 있습니다.

gitlab-org/gitlab/workhorse

학습 자료

워크호스 설치

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

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

make install

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

make install PREFIX=/foo

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

참고: 일부 기능은 빌드 태그에 따라 다르므로, 이들을 활성화하기 위해 워크호스 구성을 확인하세요.

런타임 의존성

워크호스는 업로드된 이미지에서 EXIF 데이터를 제거하기 위해 ExifTool을 사용합니다 (EXIF 데이터는 민감한 정보를 포함할 수 있습니다). GitLab을 설치한 경우:

  • 리눅스 패키지를 사용 중이라면, 모두 준비되었습니다. CentOS Minimal을 사용하고 있다면 perl 패키지를 설치해야 할 수 있습니다: yum install perl.
  • 소스에서 설치한 경우, exiftool이 설치되어 있는지 확인하세요:

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

코드 테스트

다음으로 테스트를 실행하세요:

make clean test

GitLab Workhorse의 각 기능은 해당 기능이 올바른 요청에서 ‘작동’하는지 확인하고 다른 요청에는 영향을 미치지 않는지 확인하는 통합 테스트를 가져야 합니다. 특정 동작에 대한 패키지 수준 테스트도 있는 것이 좋지만, 개발 중에는 고수준 통합 테스트가 우선적으로 고려되어야 합니다.

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