GitLab Workhorse
GitLab Workhorse는 리소스 집약적이고 오랜 시간이 걸리는 요청을 처리하기 위해 고안된 GitLab의 스마트 리버스 프록시입니다.
이는 Puma 앞에 위치하여 GitLab Rails로부터 나온 모든 HTTP 요청을 가로채고 있다.
Rails는 요청을 Workhorse로 위임하고, Workhorse는 파일 다운로드 및 업로드, git
을 통한 HTTP 푸시/풀 및 git
을 통한 HTTP 아카이브 다운로드와 같은 리소스 집약적인 HTTP 요청을 처리함으로써 리소스 활용을 최적화하고 요청 처리 효율성을 향상시킵니다.
GitLab 스택 내의 역할
Workhorse는 앞단에 기타 리버스 프록시 서버가 있을 수 있지만, NGINX만 지원됩니다.
GitLab의 여러 인스턴스, 예를 들어 gitlab.com
에서 NGINX 앞에 CloudFlare와 같은 CDN이 위치해 있는 경우가 많습니다.
소스로부터 GitLab을 설치할 때는 Apache와 같은 다른 리버스 프록시를 사용하는 것도 가능하지만(비공식 지원), 이 경우 NGINX를 사용하는 것이 좋습니다.
모든 Rails 컨트롤러 및 HTTP 요청을 처리하고 HTTP 응답을 반환하는 기타 코드는 모두 GitLab Workhorse를 통해 프록시됩니다. Workhorse는 대부분의 리버스 프록시와 다르게 매우 밀접하게 GitLab Rails와 결합되어 있습니다. 필요할 때, Workhorse는 HTTP 헤더를 수정하여 GitLab Rails가 효율적으로 작업을 오프로드할 수 있도록 합니다.
기능 및 작업
요청 처리
- Workhorse는 주로 들어오는 요청을 통과시켜 Rails로 전달하여 처리합니다. 즉, 대부분의 요청에는 최소한의 개입을 하여 요청 처리 파이프라인을 간소화합니다.
- 특정 유형의 요처에 대해서는 특히 리소스 집약적이거나 전문 처리를 필요로 하는 경우(예: 큰 파일 업로드 등), Workhorse는 더 적극적인 역할을 합니다. Rails로부터 지시를 받으면, Workhorse는 Gitaly와 직접 상호 작용하거나 파일 업로드 처리를 Rails로부터 오프로드함과 같은 특수한 작업을 수행합니다.
특수 작업 처리
- Workhorse는 Rails의 응답을 기반으로 특정 요청을 가로채고 예약된 작업을 실행할 수 있습니다. 이에는 Gitaly과 상호 작용, 대용량 데이터 blob 관리, 필요에 따라 요청 처리 로직 변경 등이 포함됩니다.
- 주목할만한 기능은 파일 업로드를 효율적으로 관리하는 능력입니다. 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
GitLab Workhorse의 각 기능은 해당 기능이 올바른 요청에 반응하고 다른 요청에 영향을 주지 않는지 확인하는 통합 테스트가 있어야 합니다. 특정 동작에 대한 패키지 수준 테스트도 가지고 있는 것이 좋지만, 개발 중에는 고수위 통합 테스트가 최우선이 되어야 합니다.
통합 테스트만으로도 기능을 충분히 확인할 수 있습니다.