📌 Description
RAG 답변 생성은 GPU 1대·Ollama 인스턴스 1개 전제로 순차 처리된다(RagJobWorker
인스턴스 정확히 1개, #218/#286/#288). 질문이 몰리면 뒤에 온 사용자일수록 대기 시간이
누적된다.
GPU를 늘리지 않고도, Ollama의 병렬 슬롯(OLLAMA_NUM_PARALLEL)을 활용해 동시에
최대 N개 질문을 처리하도록 구조를 확장한다. GPU 1대가 갖고 있던 여유 용량(단일
스트림 디코딩은 GPU 연산력을 다 못 씀)을 지금까지 안 쓰고 있었다는 전제에서 출발한다.
기존 안전장치(RagJobTimeoutSweeper의 강제 종료, #288의 조건부 UPDATE 기반
경합 방지)는 그대로 유지되어야 한다 — 이번 작업은 "안전하게 순차 처리"를
"안전하게 N개 동시 처리"로 확장하는 것이지, 안전장치를 다시 만드는 게 아니다.
✅ To-do
✅ 완료 기준
📒 기타
📌 Description
RAG 답변 생성은 GPU 1대·Ollama 인스턴스 1개 전제로 순차 처리된다(
RagJobWorker인스턴스 정확히 1개, #218/#286/#288). 질문이 몰리면 뒤에 온 사용자일수록 대기 시간이
누적된다.
GPU를 늘리지 않고도, Ollama의 병렬 슬롯(
OLLAMA_NUM_PARALLEL)을 활용해 동시에최대 N개 질문을 처리하도록 구조를 확장한다. GPU 1대가 갖고 있던 여유 용량(단일
스트림 디코딩은 GPU 연산력을 다 못 씀)을 지금까지 안 쓰고 있었다는 전제에서 출발한다.
기존 안전장치(
RagJobTimeoutSweeper의 강제 종료,#288의 조건부 UPDATE 기반경합 방지)는 그대로 유지되어야 한다 — 이번 작업은 "안전하게 순차 처리"를
"안전하게 N개 동시 처리"로 확장하는 것이지, 안전장치를 다시 만드는 게 아니다.
✅ To-do
OLLAMA_NUM_PARALLEL=N설정 후 curl로 Ollama 자체가 실제 병렬 처리하는지인프라 레벨 검증 (애플리케이션 코드 변경 전)
RagResponseRepository에 원자적 claim 쿼리 추가(
SELECT ... FOR UPDATE SKIP LOCKED,embedding_jobs패턴 재사용)RagJobWorker를@Scheduled단일 폴링에서, 전용 스레드풀 기반 N개 독립워커 루프 구조로 전환
(
#218의CountDownLatch동시 접수 방법론 재사용)ollama.generate-deadline(60s) /rag.worker.stale-threshold(90s)를병렬 처리 실측치 기준으로 재조정
RagJobTimeoutSweeper가 처리 중(락 걸린) job을 만났을 때의 대기 동작 관찰및 문서화 (같은 sweep 주기 내 다른 stale job 처리 지연 가능성)
✅ 완료 기준
SKIP LOCKED로 방지 확인)#288)가 다중 워커환경에서도 그대로 유효함을 테스트로 확인
📒 기타
docs/design/에 별도 작성 예정LISTEN/NOTIFY)으로 바꾸는 건 이번 스코프 아님 — 병렬화실측/안정화 이후 별도 이슈로 분리 예정