청크 스트림 업로드와 중단 재개
실패 시 전체 재전송 없이 chunk_start_idx부터 이어 올리기
대용량 ZIP을 한 요청으로 받으면 네트워크 끊김·타임아웃 시 처음부터 다시 올려야 했습니다. FreeComics에서는 request_id를 먼저 발급(/translation-re/init)한 뒤, 클라이언트가 파일을 청크로 나눠 POST /translation-re/chunk로 보냅니다.
각 청크는 Busboy로 multipart 스트림을 받아 /mnt/nvme/uploads/{request_id}/{chunkIndex}.part에 쓰고, Redis 해시 upload_chunks:{request_id}에 인덱스를 pending → done으로 마킹합니다. 헤더 x-request-id, x-chunk-index, x-chunk-total이 이 상태를 맞춥니다.
상세 조회 API는 Redis에서 첫 pending(없으면 다음 인덱스)을 chunk_start_idx로 돌려주어, 클라이언트는 그 지점부터만 재전송합니다. 전부 done이면 /merge가 worker_threads mergeWorker로 part를 합치고 번역 큐에 넣습니다.
- Busboy 스트림 → `{index}.part` 디스크 저장으로 메모리에 전체 파일을 올리지 않음
- Redis `upload_chunks` pending/done + `chunk_start_idx`로 재개 지점 제공
- merge는 별도 Worker로 분리해 API 이벤트 루프 블로킹을 줄임
- src/services/translation_re/translation_re_service.ts — postChunkTranslationFile, getTranslationReFileDetail
- src/common/workers/workerChunkHandle.ts — markChunk*, isAllChunksReceived, mergeChunksToFile