GitLab Workhorse
GitLab Workhorse는 리소스 집약적이고 장기적인 요청을 처리하기 위해 고안된 GitLab의 스마트 리버스 프록시입니다.
Puma 앞에 위치하고 있으며 GitLab Rails를 대상으로 하는 모든 HTTP 요청을 가로채고 처리합니다.
Rails는 요청을 Workhorse로 위임하고, Workhorse는 파일 다운로드 및 업로드, git
을 통한 HTTP 푸시/풀 및 HTTP 아카이브 다운로드와 같은 리소스 집약적인 HTTP 요청과 관련된 책임을 지며, 이로써 리소스 활용을 최적화하고 요청 처리 효율을 향상시킵니다.
GitLab 스택 내의 역할
Workhorse는 다른 리버스 프록시 서버가 앞에 위치할 수 있지만, NGINX만 지원됩니다.
GitLab을 소스로 설치할 때 Apache와 같은 다른 리버스 프록시를 사용하는 것도 가능하지만(비공식 지원), gitlab.com
과 같은 많은 GitLab 인스턴스에서는 CloudFlare와 같은 CDN이 NGINX 앞에 위치합니다.
모든 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가 리버스 프록시로 작동하여 높은 부하를 처리할 수 있는 능력을 보여주며, 이로써 Rails에 직접적인 부하가 줄어듭니다.
아키텍처적 고려사항
기능 확장
- 단순함 유지: Workhorse의 기능을 특정 서비스(예: 컨테이너 레지스트리)의 직접 처리도 포함시키면서 단순함과 효율성을 유지하는 것이 중요합니다. Workhorse는 복잡한 제어 로직을 포함시키지 말고 Rails가 지시한대로 작업을 수행하는 것에 초점을 맞추어야 합니다.
- 서비스 구현 및 데이터 이관: Workhorse에 새로운 기능을 구현하는 데에는 데이터 이관 전략과 서비스 연속성을 신중히 고려해야 합니다.
데이터 관리와 운영 무결성
- Workhorse의 아키텍처는 가비지 수집 및 데이터 이관을 포함한 효율적인 데이터 관리 전략을 용이하게 합니다. Workhorse의 역할은 복잡한 데이터 조작이나 제어 로직에 직접적으로 관여하지 않고, 이는 Rails의 영역으로 남습니다.
- 백그라운드 처리나 장기 실행 작업이 필요한 경우, Workhorse와 Rails가 작업 실행과 데이터 무결성을 관리하기 위해 별도의 서비스나 Sidekiq 작업 대기열을 사용하는 것이 좋습니다.
Workhorse는 Rails 모노 레포의 하위 폴더에 포함되어 있으며 gitlab-org/gitlab/workhorse에서 확인할 수 있습니다.
학습 자료
- Workhorse 문서 (본 페이지)
- 동영상: GitLab Workhorse Deep Dive: Dependency Proxy
- 의존성 프록시와 Workhorse의 작동 방식
- 의존성 프록시를 위한 Workhorse 개요
- Workhorse 아키텍처 논의
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
을 사용해야 할 수 있습니다.
참고: 일부 기능은 빌드 태그에 의존하므로 활성화하려면 Workhorse 구성을 확인하세요.
실행시 종속 요소
Workhorse는 업로드된 이미지에서 민감한 정보를 포함할 수 있는 EXIF 데이터를 제거하기 위해 ExifTool을 사용합니다. GitLab을 설치한 경우:
- Linux 패키지를 사용하는 경우 이미 설정되어 있습니다.
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
각 기능은 통합 테스트를 갖춰야 합니다. 이를 통해 기능이 올바른 요청에서 ‘작동’하는지 확인하고 다른 요청에는 영향을 미치지 않는지 확인할 수 있습니다. 특정 동작에 대한 패키지 수준의 테스트를 갖추는 것이 좋지만, 개발 중에는 상위 수준의 통합 테스트가 처음 우선되어야 합니다.
기능이 통합 테스트로만 커버되어 있어도 괜찮습니다.