1. 서버 구조 개요
이 시스템은 클라이언트 요청을 처리하기 위해 Fastify 서버와 Python 서버가 상호작용하며, 작업 요청과 결과를 처리하는 구조로 설계되었습니다.
- Fastify 서버:
- 클라이언트로부터 요청을 받아 Redis 작업 큐에 작업을 등록.
- 작업 결과를 기다렸다가 클라이언트에 반환.
- Python 서버:
- Redis 작업 큐에서 작업을 가져와 GPU 기반의 모델 추론을 실행.
- 작업 결과를 Redis Pub/Sub 채널을 통해 Fastify 서버에 전달.
- Redis:
- 작업 큐: Fastify와 Python 서버 간 작업 요청 및 처리 상태를 관리.
- Pub/Sub: Python 서버가 작업 결과를 Fastify 서버에 전달.
- 스트림: 작업의 퍼포먼스 데이터를 기록.
2. 시스템 초기화
Fastify 서버
- Redis 초기화:
- Fastify 서버가 시작될 때 gpuWorkerInit 함수가 호출되어 Redis 연결을 설정.
- 작업 큐 및 Pub/Sub 채널(jobDone) 초기화.
- API 등록:
- /td/generate와 같은 엔드포인트를 등록.
- 클라이언트 요청 처리 및 작업 등록 준비 완료.
Python 서버
- Docker 컨테이너 실행:
- Python 서버는 Docker 컨테이너로 실행.
- GPU 리소스 확인 및 Redis와 연결.
- Redis 연결:
- MessageHandler 클래스에서 Redis 연결을 설정하고 Pub/Sub 채널(jobDone)을 준비.
3. 작업 처리 흐름
1) 클라이언트 요청
- 클라이언트는 /td/generate 엔드포인트로 작업 요청을 전송.
- 요청 데이터는 JSON 형식으로 전달되며, Fastify 서버에서 **요청 스키마(reqType)**를 통해 검증.
{
"model": "pencil",
"prompt": "A smiling boy",
"denoise": 0.65,
"threeDRefBase64": "base64_image_data"
}
2) Fastify 서버의 작업 등록
- 요청 데이터가 검증되면 gpuWorkerRequestJob 함수가 호출됩니다.
- gpuWorkerRequestJob:
- 작업 데이터를 JSON으로 변환하여 Redis 작업 큐(3d 또는 3d_tag)에 등록.
- 등록된 데이터는 작업 ID, 작업 타입, 입력 데이터 등을 포함.
작업 등록 예시 (Redis rPush):
{
"id": "job123",
"jobType": "3d_generate",
"input": { "model": "pencil", "prompt": "A smiling boy" },
"time": 1698399210
}
3) Python 서버의 작업 처리
- Python 서버는 무한 루프(while True)에서 Redis 작업 큐를 모니터링.
- blpop 명령어로 큐에서 작업을 가져옵니다.
- 작업 데이터는 JSON 형식으로 파싱.
- 작업 데이터를 확인한 후, 적절한 핸들러 클래스를 선택하여 GPU 기반 추론을 수행.
- 예: CompyHandlerGenerate 클래스에서 processComfy 메서드 실행.
- 추론 결과를 생성한 뒤, Redis Pub/Sub 채널(jobDone)에 작업 결과를 publish.
결과 발행 예시 (publish):
{
"id": "job123",
"result": "success",
"output": "base64_image_result"
}
4) 작업 결과 처리 및 반환
- Fastify 서버는 Redis Pub/Sub 채널(jobDone)에서 작업 결과를 수신.
- 수신된 결과는 Promise Resolver를 통해 클라이언트에 반환됩니다.
응답 예시:
{
"id": "job123",
"status": "success",
"output": "base64_image_result"
}
4. 주요 컴포넌트 설명
Fastify 서버
- gpuWorkerRequestJob:
- Redis 작업 큐에 작업 데이터를 등록.
- 작업 결과를 기다리고 클라이언트에 반환.
- app.route:
- 클라이언트 요청을 처리하고, 핸들러에서 작업 등록 및 결과 반환.
Python 서버
- MessageHandler:
- Redis와 상호작용(작업 큐 모니터링, Pub/Sub 메시지 발행).
- 작업 결과를 퍼포먼스 스트림에 기록.
- 핸들러 클래스:
- CompyHandlerGenerate, CompyHandlerTagger 등.
- 작업 유형에 따라 GPU 모델 추론을 수행.
Redis
- 작업 큐:
- 작업 요청을 저장.
- Python 서버에서 작업을 가져가기 위해 사용.
- Pub/Sub:
- Python 서버에서 작업 결과를 Fastify 서버로 전달.
- 스트림:
- 작업의 퍼포먼스 데이터를 기록.
5. 동작 흐름 요약
- 클라이언트 요청:
- /td/generate로 작업 요청.
- 작업 등록:
- Fastify 서버가 Redis 작업 큐에 작업을 등록.
- 작업 처리:
- Python 서버가 작업을 가져와 GPU 추론 수행.
- 결과 전달:
- Python 서버가 작업 결과를 Redis Pub/Sub 채널에 발행.
- 클라이언트 응답:
- Fastify 서버가 작업 결과를 수신하고 클라이언트에 반환.
'Projects' 카테고리의 다른 글
Python으로 비동기와 멀티스레딩을 활용한 작업 관리 API 구축 (0) | 2024.11.23 |
---|