EN
CASE 05Fruition / Kafka 비동기 병렬 처리, AI 파이프라인

문서 병렬 분석 - 처리시간 282.11초 → 73.89초 단축

문서를 활용한 Wiki 생성이 순차 처리로 구성되어 있어, 대형 문서의 Wiki 생성 시 처리 시간이 증가해 사용자의 부정적 경험을 우려했습니다. 이에 Worker를 늘린 효과와 자원 사용을 확인하고, 문서 분석과 벡터 생성에 서로 다른 확장 기준을 세웠습니다.

282.11초Worker 1개
73.89초Worker 4개
약 4배프로세스 메모리 합

2026.09

AI 파이프라인KafkaPostgreSQL동시성과 메모리

01 배경

문서를 Wiki로 생성하는 AI 파이프라인을 순차 처리하면 뒤의 문서가 외부 AI 응답을 기다려야 했습니다. 이를 위해 작업자를 늘리면 API 호출과 메모리 사용도 함께 증가하므로 어느 단계까지 확장할지 확인해야 했습니다. 작업 분배에는 메시지를 다시 읽을 수 있고 같은 키 안에서 순서를 보장하는 Kafka를 써, 오래 걸리는 AI 작업을 비동기로 돌리면서 ID 기준으로 중복 처리를 막았습니다. Worker를 1개에서 4개로 늘려 분석 시간을 282.11초에서 73.89초로 줄였습니다. 반면 Worker 안의 동시 AI 요청을 2개에서 4개로 늘리자 95.92초로 오히려 느려졌고, 같은 GPU에서 벡터 생성을 2개 돌리자 각각 약 9.5초에서 19~21초로 늘었습니다. 두 단계는 병렬화 효과가 달라 확장 기준을 나눴습니다.

해결하면 얻는 것

Wiki 생성이 늦어지면 사용자는 올린 문서를 바로 쓰지 못하고, 첫 사용에서 가치를 느끼기도 전에 이탈할 수 있다고 우려했습니다. 대기를 줄인다면 업로드 직후부터 검색과 질문에 문서를 쓸 수 있다고 생각했습니다.

02 실험과 개선 과정

    03 개선한 처리 흐름

    ARCHITECTUREMermaid diagram
    flowchart TD
     A[문서 처리 요청] --> K[Kafka에서 문서별 작업 분배]
     K --> W[여러 Worker로 분석, Worker별 동시 요청 제한]
     W --> L[같은 워크스페이스의 저장은 잠금으로 조정]
     V[벡터 생성] --> G[같은 GPU의 처리 경합 확인]
     L --> D[시간, 메모리, 내용 보존을 함께 확인]
     G --> D
     D --> R[단계별 증설 여부 판단]

    문서의 Wiki 생성과 벡터 생성의 확장 가능성을 나눠 확인한 구조입니다.

    Mermaid 원문 보기
    flowchart TD
     A[문서 처리 요청] --> K[Kafka에서 문서별 작업 분배]
     K --> W[여러 Worker로 분석, Worker별 동시 요청 제한]
     W --> L[같은 워크스페이스의 저장은 잠금으로 조정]
     V[벡터 생성] --> G[같은 GPU의 처리 경합 확인]
     L --> D[시간, 메모리, 내용 보존을 함께 확인]
     G --> D
     D --> R[단계별 증설 여부 판단]

    04 결과와 배운 점

    문서 4개 분석 시간 73.8% 단축, 문서 100개 큐 재현 300건 누락과 실패 0건

    Worker 4개, 각 2개 동시 요청 조건에서 문서 4개의 총 처리 시간을 약 73.8% 줄였습니다. 대신 프로세스 메모리 합이 351.7MiB에서 1,401.0MiB로 약 4배 늘었습니다. 미리 정해 둔 사실 16개 중 완전히 보존된 수도 Worker 1, 2, 4개에서 10, 14, 11개로 달라, 조건별 1회의 작은 표본이지만 품질이 같다고 보지는 않았습니다. 동시 요청을 더 늘리는 제안과, 같은 GPU에서 벡터 생성을 병렬화하는 제안은 오히려 느려져 제외했습니다. 외부 응답 대기와 장치 경합은 서로 다른 병목이라, 확장 방식도 단계마다 달라야 했습니다. 저장된 AI 응답으로 문서 100개의 큐 처리를 3가지 조건에서 재현해, 총 300건 모두 누락과 실패 없이 처리됨을 확인했습니다. 메모리 증가는 MSA로 EKS에서 AI 기능을 분산 배치해 감당할 수 있다고 보고, 문서 병렬 처리에는 최대 Worker 4개를 쓰기로 했습니다.

    Worker 1개282.11초4문서(8번의 호출)
    Worker 4개73.89초최대 API 동시 요청 8개
    프로세스 메모리 합약 4배351.7 → 1,401.0MiB
    결과의 범위와 트레이드오프

    같은 문서로 조건별 1회 분석한 결과입니다. 저장, 후처리까지 포함한 E2E 속도는 아닙니다.