Workhorse 핸들러
GitLab Workhorse가 긴 HTTP 요청을 효율적으로 처리하는 방법과 인젝터, 사전 인가 요청, Git over HTTP(S) 흐름을 설명합니다.
Rails에서 긴 HTTP 요청을 효율적으로 처리하는 것은 어렵습니다. 이러한 요청은 메모리 비효율적(파일 업로드)이거나, 더 짧은 타임아웃(예: Puma 서버의 60초 타임아웃) 때문에 아예 처리가 불가능합니다. Workhorse는 많은 수의 긴 HTTP 요청을 효율적으로 처리할 수 있습니다. Workhorse는 모든 HTTP 요청을 가로채는 프록시 역할을 하며, 요청을 변경 없이 전달하거나 추가 로직을 수행하여 직접 처리합니다. 인젝터 # %%{init: { "fontFamily": "GitLab Sans" }}%% sequenceDiagram participant Client participant Workhorse participant Rails Client->>+Workhorse: Request Workhorse->>+Rails: Propagate the request as-is Rails-->>-Workhorse: Respond with a special header that contains instructions for proceeding with the request Workhorse-->>Client: Response 예시: Git blob 전송 # %%{init: { "fontFamily": "GitLab Sans" }}%% sequenceDiagram participant Client participant Workhorse participant Rails participant Gitaly Client->>+Workhorse: HTTP Request for a blob Workhorse->>+Rails: Propagate the request as-is Rails-->>-Workhorse: Respond with a git-blob:{encoded_data} header Workhorse->>+Gitaly: BlobService.GetBlob gRPC request Gitaly-->>-Workhorse: BlobService.GetBlob gRPC request Workhorse-->>Client: Stream the data GitLab Rails가 요청을 처리하는 방법 # send_git_blob 특정 정보가 담긴 헤더 전송 Workhorse가 헤더를 처리하는 방법 # 인젝터 목록 지정 인젝터를 반복하여 일치 항목 탐색 특정 요청 처리 예시: 파일 전송 # %%{init: { "fontFamily": "GitLab Sans" }}%% sequenceDiagram participant Client participant Workhorse participant Rails participant Object Storage Client->>+Workhorse: HTTP Request for a file Workhorse->>+Rails: Propagate the request as-is Rails-->>-Workhorse: Respond with a send-url:{encoded_data} header Workhorse->>+