Projects

Fastify와 Python 서버 간 작업 처리

monkeykim 2024. 11. 27. 21:22

1. 서버 구조 개요

이 시스템은 클라이언트 요청을 처리하기 위해 Fastify 서버 Python 서버가 상호작용하며, 작업 요청과 결과를 처리하는 구조로 설계되었습니다.

  • Fastify 서버:
    • 클라이언트로부터 요청을 받아 Redis 작업 큐에 작업을 등록.
    • 작업 결과를 기다렸다가 클라이언트에 반환.
  • Python 서버:
    • Redis 작업 큐에서 작업을 가져와 GPU 기반의 모델 추론을 실행.
    • 작업 결과를 Redis Pub/Sub 채널을 통해 Fastify 서버에 전달.
  • Redis:
    • 작업 큐: Fastify와 Python 서버 간 작업 요청 및 처리 상태를 관리.
    • Pub/Sub: Python 서버가 작업 결과를 Fastify 서버에 전달.
    • 스트림: 작업의 퍼포먼스 데이터를 기록.

2. 시스템 초기화

Fastify 서버

  1. Redis 초기화:
    • Fastify 서버가 시작될 때 gpuWorkerInit 함수가 호출되어 Redis 연결을 설정.
    • 작업 큐 및 Pub/Sub 채널(jobDone) 초기화.
  2. API 등록:
    • /td/generate와 같은 엔드포인트를 등록.
    • 클라이언트 요청 처리 및 작업 등록 준비 완료.

Python 서버

  1. Docker 컨테이너 실행:
    • Python 서버는 Docker 컨테이너로 실행.
    • GPU 리소스 확인 및 Redis와 연결.
  2. 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 서버의 작업 등록

  1. 요청 데이터가 검증되면 gpuWorkerRequestJob 함수가 호출됩니다.
  2. 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 서버의 작업 처리

  1. Python 서버는 무한 루프(while True)에서 Redis 작업 큐를 모니터링.
    • blpop 명령어로 큐에서 작업을 가져옵니다.
    • 작업 데이터는 JSON 형식으로 파싱.
  2. 작업 데이터를 확인한 후, 적절한 핸들러 클래스를 선택하여 GPU 기반 추론을 수행.
    • 예: CompyHandlerGenerate 클래스에서 processComfy 메서드 실행.
  3. 추론 결과를 생성한 뒤, Redis Pub/Sub 채널(jobDone)에 작업 결과를 publish.

결과 발행 예시 (publish):

{
  "id": "job123",
  "result": "success",
  "output": "base64_image_result"
}

4) 작업 결과 처리 및 반환

  1. Fastify 서버는 Redis Pub/Sub 채널(jobDone)에서 작업 결과를 수신.
  2. 수신된 결과는 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. 동작 흐름 요약

  1. 클라이언트 요청:
    • /td/generate로 작업 요청.
  2. 작업 등록:
    • Fastify 서버가 Redis 작업 큐에 작업을 등록.
  3. 작업 처리:
    • Python 서버가 작업을 가져와 GPU 추론 수행.
  4. 결과 전달:
    • Python 서버가 작업 결과를 Redis Pub/Sub 채널에 발행.
  5. 클라이언트 응답:
    • Fastify 서버가 작업 결과를 수신하고 클라이언트에 반환.