전체 글
-
arq: AsyncIO-native Task QueueKnowledge Base/Python 2025. 12. 29. 20:30
Overviewarq는 Python asyncio를 네이티브로 지원하는 분산 태스크 큐이다.Celery의 복잡성 없이 async/await 패턴을 그대로 사용할 수 있다.Celery vs arq항목Celeryarq동시성 모델prefork, gevent, eventletasyncio (네이티브)BrokerRabbitMQ, Redis, SQS 등Redis only메모리~4-8KB per greenlet~2-4KB per coroutineCanvas (Chain, Group)✅ 지원❌ 미지원Beat (스케줄링)✅ 내장⚠️ cron 함수로 대체Flower (모니터링)✅ 생태계❌ 직접 구현복잡도높음낮음핵심 개념1. Worker 정의# worker.pyfrom arq import create_poolfrom arq..
-
Scan API 50->500 VUs, RPM 400+ 디벨롭까지의 수기, 그리고 잡담과 사견잡담 2025. 12. 29. 05:08
처음엔 Task용 Queue로 시작했던 Scan API가 SSE면서 Async와 큐잉, Event가 공존하는 "FOR REAL" LLM API가 되어있었다. 8-10초 딜레이의 GPT API에 두 번 묶여, 각 서버 간 내부 통신을 gRPC 동기로 빼도 동시처리량 80-100을 간당간당하게 버티던 Scan API가 어느덧 VU 500을 돌파해 RPM 400의 속도로 600 테스트를 앞두게 되니, 이코에코의 아버지로서 정말 감개가 무량하다. (친부는 Opus일 수도 있다.) 기존 Scan API는 문자 그대로 'VU 50도 간당간당했다.' 클러스터의 베이스라인(안좋게 말하면 글로벌 초크)인 ext-authz는 테스트 기준 동시접속자 2500명에 RPS 1200+를 뽑는 상황에서, AI API가 MQ를 구성..
-
이코에코(Eco²) Streams & Scaling for SSE #11: Scan API 부하 테스트 (2)이코에코(Eco²) Context/Performance 2025. 12. 29. 00:23
VU 300 부하 한계점 분석테스트 데이터 비교 (250 VU vs 300 VU)요청 수1,7541,732-22건 (-1.3%)완료율99.94%99.94%동일Throughput417.6 req/m402 req/m-0.22 (-3.2%)E2E p9540.5초48.5초+8초 (+20%)E2E avg30.2초37.6초+7.4초 (+25%)테스트 시간252초256.8초+4.8초부하 포화 징후┌────────────────────────────────────────────────────────────────────────┐│ 📊 Little's Law 기반 분석 │├──────────────────────────────────..
-
이코에코(Eco²) Streams & Scaling for SSE #10: Scan API 부하 테스트 (1)이코에코(Eco²) Context/Performance 2025. 12. 28. 17:06
테스트 시나리오 (K6)┌─────────────────────────────────────────────────────────────────────────────┐│ VU n Load Test Timeline │├─────────────────────────────────────────────────────────────────────────────┤│ ││ VU ..
-
이코에코(Eco²) Streams & Scaling for SSE #9: Race Condition 해결과정과 수평확장이코에코(Eco²)/Event Streams & Scaling 2025. 12. 28. 14:52
이전 글: Event Bus Layer 구현 Event Router + Redis Pub/Sub 기반의 SSE HA 아키텍처를 구현했지만, 실제 E2E 테스트에서 중간 이벤트 누락이 관측됐습니다. 이 글에서는 문제 관측부터 디버깅, 해결까지의 과정을 기록합니다.1. 관측된 문제1.1 증상# E2E 테스트 실행curl -s -X POST "https://api.dev.growbin.app/api/v1/scan" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{"image_url": "..."}'# SSE 스트림 연결curl -s -N "https://api.dev.growbin.app/api/v1/stre..
-
FLP Impossibility: 분산 합의의 불가능성Knowledge Base/Foundations 2025. 12. 28. 13:09
비동기 분산 시스템에서 단 하나의 노드 장애만 허용해도 합의를 보장하는 결정론적 알고리즘은 존재하지 않는다.1차 지식생산자원본 논문논문저자발표핵심 내용Impossibility of Distributed Consensus with One Faulty ProcessMichael J. Fischer (Yale), Nancy A. Lynch (MIT), Michael S. Paterson (Warwick)JACM 1985FLP Impossibility 원본 논문저자 소개┌─────────────────────────────────────────────────────────────────┐│ FLP 논문 저자 │├────..
-
이코에코(Eco²) Streams & Scaling for SSE #8: Event Router 구현이코에코(Eco²)/Event Streams & Scaling 2025. 12. 27. 22:13
TL;DR이전 포스팅에서 Eco² Composite Event Bus의 구축 전반을 서술했습니다.이번 포스팅에서는 Event Router의 코드 구현을 상세히 살펴봅니다. 핵심 모듈:main.py: FastAPI 앱, 라이프사이클 관리core/consumer.py: XREADGROUP 기반 이벤트 소비core/processor.py: Lua Script 기반 멱등성 처리core/reclaimer.py: XAUTOCLAIM 기반 장애 복구1. 모듈 구조domains/event-router/├── main.py # FastAPI 앱 진입점├── config.py # 환경 설정├── core/│ ├── consumer.py # StreamConsumer ..
-
이코에코(Eco²) Streams & Scaling for SSE #7: Event Bus Layer이코에코(Eco²)/Event Streams & Scaling 2025. 12. 27. 21:51
TL;DR이전 포스팅에서 Fan-out 계층의 필요성을 도출했습니다. 이번 포스팅에서는 Event Bus Layer의 실제 구현 과정을 기록합니다.Eco² Event Bus는 Redis Streams를 Durable Buffer(신뢰성 버퍼)로, Pub/Sub를 실시간 전달 채널로 사용하여 SSE Gateway로 fan-out하는 Composite Event Bus 계층입니다. 핵심 내용:Redis Streams Consumer Group 기반 이벤트 소비Pub/Sub로 실시간 fan-out멱등성 보장을 위한 Lua ScriptKafka 패턴과의 비교 및 Redis 기반 재구현배포 과정에서 마주친 트러블슈팅1. 아키텍처 분류: Composite Event Bus1.1 용어 정의Router목적지 결정 (라..