전체 글
-
이코에코(Eco²) Eventual Consistency #0: ext-authz 로컬 캐싱 설계이코에코(Eco²)/Eventual Consistency 2025. 12. 29. 20:55
아이디어: Worker 로컬 캐시와 RabbitMQ Fanout 기반 동기화관련 부하 테스트: ext-authz 부하 분석개요ext-authz의 JWT Blacklist 조회를 Redis 원격 호출에서 로컬 캐시 + MQ 브로드캐스트 방식으로 전환하여 인증 레이턴시와 Redis Single Queue 병목을 해소하는 것이 목표입니다.1. 현재 아키텍처 분석1.1 현재 흐름┌──────────────────────────────────────────────────────────────────┐│ 매 요청마다 Redis 호출 │└─────────────────────────────────────────────────────────..
-
Scan API 600 VUs Load Test: 처리량 포화 분석 리포트이코에코(Eco²)/Reports 2025. 12. 29. 20:36
Date: 2025-12-29 19:30~19:40 KSTTest Duration: 270.1s (4m30s)Result: 33.2% Completion Rate (Throughput Saturation)Overviewhttps://snapshots.raintank.io/dashboard/snapshot/AIAkKSCF1y6UbA4URziiwD0bbdLPOvBe 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...
-
arq: AsyncIO-native Task QueuePython 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²)/Event Streams & Scaling 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²)/Event Streams & Scaling 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: 분산 합의의 불가능성이코에코(Eco²)/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 논문 저자 │├────..