전체 글
-
이코에코(Eco²) Message Queue #12: Gevent 기반 LLM API 큐잉 시스템이코에코(Eco²)/Message Queue 2025. 12. 25. 03:36
목표OpenAI GPT-5.1 기반 폐기물 분류 파이프라인을 고가용성 큐잉 시스템으로 구현:RPM 제한 대응: 50RPM+ 환경에서 안정적 처리실시간 진행률: SSE로 4단계 파이프라인 상태 스트리밍장애 복원력: DLQ 기반 자동 재처리수평 확장: HPA로 부하 기반 자동 스케일링핵심 수치지표Before (동기)After (큐잉)개선율동시 처리량3 req50+ req33x메모리 사용4GB (prefork)1GB (gevent)75%↓장애 복구수동자동 (DLQ)-스케일링수동HPA 자동-Queueing 시스템 구성도Celery Chain 파이프라인4단계 파이프라인 구조파이프라인 실행 절차StepTask역할평균 소요시간1️⃣visionGPT-5.1 Vision API로 이미지 분류 (major/middle/m..
-
Message Queue 트러블슈팅: Gevent Pool 마이그레이션 및 Stateless 체이닝의 한계이코에코(Eco²) Context/Troubleshooting 2025. 12. 25. 03:16
#11 Prefork 병목 분석에서 I/O-bound 워크로드(65% OpenAI API)에 prefork가 비효율적임을 확인하고, Gevent Pool로 전환했습니다. 이 문서는 전환 과정에서 발생한 7개 문제와 해결 과정을 기록합니다.2. 문제 목록1Gevent + Asyncio 충돌98% 요청 실패🔴 Critical~2시간2Redis ReadOnly ReplicaResult 저장 실패🔴 Critical~1시간3RPC Result Backend 한계character.match 타임아웃🟠 High~1시간4Character Cache 미로드match 실패, 더미 응답🟠 High~2시간5SSE 이벤트 처리 오류reward: null 응답🟠 High~1시간6DLQ 라우팅 오류Task 미등록 에러🟡..
-
동시성 모델과 Green ThreadKnowledge Base/Python 2025. 12. 24. 21:06
이 문서는 Python에서 사용 가능한 4가지 동시성 모델을 비교한다.먼저 동시성을 보다 잘 이해하기 위해 혼동되는 개념인 병렬성과의 차이를 짚고 가자.┌─────────────────────────────────────────────────────────────┐│ 동시성 vs 병렬성 │├─────────────────────────────────────────────────────────────┤│ ││ Concurrency (동시성): ││ ───..
-
Event Loop: GeventKnowledge Base/Python 2025. 12. 24. 20:58
핵심 질문: Event Loop란 무엇이며, 왜 서로 다른 Event Loop는 충돌할까? Event Loop는 단일 스레드에서 여러 I/O 작업을 동시에 처리하는 메커니즘이다.┌─────────────────────────────────────────────────────────────┐│ Event Loop의 본질 │├─────────────────────────────────────────────────────────────┤│ ││ "루프 안에서 I/O 이벤트를 감지하고, ..
-
이코에코(Eco²) Message Queue #11: Celery Prefork 병목 지점 (Concurrency, IO Bound - LLM이코에코(Eco²)/Message Queue 2025. 12. 24. 16:31
https://snapshots.raintank.io/dashboard/snapshot/9JSNyj25kwGN55i0Rca176dBEcwUksNt GrafanaIf you're seeing this Grafana has failed to load its application files 1. This could be caused by your reverse proxy settings. 2. If you host grafana under subpath make sure your grafana.ini root_url setting includes subpath. If not using a reverse proxy msnapshots.raintank.io 본 문서는 Celery Pool을 Gevent로 전환하기..
-
이코에코(Eco²) Message Queue #10: DB INSERT 멱등성 처리, Celery Batch로 일괄 처리이코에코(Eco²)/Message Queue 2025. 12. 24. 12:16
이전 글: 보상 판정과 Persistence 분리 구현 본 문서는 celery-batches 패키지를 활용한 배치 처리와 ON CONFLICT DO NOTHING 기반 멱등성 보장 구현을 다룬다.1. 배치 처리 필요성1.1 개별 INSERT 문제Fire&Forget으로 save_ownership, save_my_character를 발행하면 트래픽 증가 시:요청 1 → DB 연결 → INSERT → 연결 반환요청 2 → DB 연결 → INSERT → 연결 반환...문제점:매 요청마다 DB 연결 생성/반환 오버헤드트랜잭션 로그 write 횟수 증가DB 커넥션 풀 소진 위험1.2 배치 처리 이점요청 1~50 → 버퍼에 쌓음 → 50개 모이면 한 번에 처리 → DB 연결 1회 → BULK INSE..
-
이코에코(Eco²) Message Queue #9: 캐릭터 보상 판정과 DB 레이어 분리, Eventual Consistency 적용 (2)이코에코(Eco²)/Message Queue 2025. 12. 24. 11:51
관련 글: 보상 판정과 DB 레이어 분리 설계 (1) 본 문서는 (1)편에서 설계한 보상 판정/저장 분리 아키텍처의 최종 구현과 로컬 캐시 기반 매칭을 다룬다.1. 설계 변경 요약항목(1)편 설계최종 구현Dispatcherpersist_reward_task (별도 task)제거 (scan.reward에서 직접)캐릭터 매칭DB 조회로컬 캐시매칭 호출동일 Worker 내별도 Worker 동기 호출Queue 구조reward.persistcharacter.match + character.rewardgRPCmy 도메인용완전 제거변경 이유persist_reward_task 제거:(1)편 설계에서 dispatcher task가 delay() 두 번만 수행. 불필요한 홉 제거:# Beforescan.reward → p..
-
이코에코(Eco²) Message Queue #8: Local Cache Event Broadcast이코에코(Eco²)/Message Queue 2025. 12. 24. 11:48
본 문서는 Worker 로컬 캐시를 활용한 DB 조회 없는 매칭과 RabbitMQ Fanout Exchange 기반 캐시 동기화 구현을 다룬다.1. 설계 배경1.1 기존 문제캐릭터 매칭에서 매 요청마다 PostgreSQL 조회:async def evaluate_reward(self, classification): characters = await self.repository.get_all() # ~50ms for char in characters: if char.match_label == classification.middle_category: return char문제점:매 요청 DB 조회 (~50ms 추가)DB 장애 시 매칭 불가Worker 스케일링 = DB..