전체 글
-
동시성 모델과 Green ThreadPython 2025. 12. 24. 21:06
이 문서는 Python에서 사용 가능한 4가지 동시성 모델을 비교한다.먼저 동시성을 보다 잘 이해하기 위해 혼동되는 개념인 병렬성과의 차이를 짚고 가자.┌─────────────────────────────────────────────────────────────┐│ 동시성 vs 병렬성 │├─────────────────────────────────────────────────────────────┤│ ││ Concurrency (동시성): ││ ───..
-
Event Loop: GeventPython 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..
-
이코에코(Eco²) Message Queue #7: Celery Chain + Celery Events (2)이코에코(Eco²)/Message Queue 2025. 12. 24. 11:44
이전 글: Celery Chain + Celery Events (1)관련 트러블슈팅: Celery + RabbitMQ 트러블슈팅 가이드개요본 문서는 4단계 Scan Pipeline + Fire&Forget RDB 저장으로 고도화된 Celery Chain 아키텍처를 다룬다.클라이언트 응답 경로에서 Persistence Layer를 완전히 제거하여 Stateless한 응답을 구현했다.1. 설계 원칙1.1 기존 아키텍처의 문제(1)편에서 scan_reward_task가 character-worker에서 실행되며 DB 조회와 gRPC 호출을 포함:scan-worker character-worker┌────────────────────────┐ ┌──────────────..
-
Message Queue 트러블슈팅: Quorum Queue -> Classic Queue 마이그레이션이코에코(Eco²) 제작 문서 및 리포트/Troubleshooting 2025. 12. 24. 09:20
환경 정보ComponentVersionRabbitMQ4.0.9Celery5.4.0kombu5.6.1amqp5.3.1Python3.11.14RabbitMQ Messaging Topology Operatorlatest (rabbitmqoperator/messaging-topology-operator)RabbitMQ Cluster Operatorlatest (rabbitmqoperator/cluster-operator)Kubernetesv1.28.15문제 상황증상Celery 워커들이 RabbitMQ에 연결 후 즉시 연결이 끊기고 무한 재시작하는 현상 발생:[2025-12-24 00:03:34,585: INFO/MainProcess] Connected to amqp://admin:**@eco2-rabbitmq...