전체 글
-
FastAPI Clean ExamplePython 2025. 12. 31. 00:29
참조: ivan-borovets/fastapi-clean-example작성일: 2025-12-30이 프로젝트에서 사용하는 아키텍처 패턴들의 원본 출처와 핵심 개념입니다.Clean Architecture항목내용창시자Robert C. Martin ("Uncle Bob")발표2012년 8월 블로그 → 2017년 책 출간원본The Clean Architecture책Clean Architecture: A Craftsman's Guide to Software Structure and Design (2017)핵심 원칙:의존성 규칙 (Dependency Rule): 의존성은 항상 안쪽(고수준)으로만 향한다독립성: Framework, UI, Database, 외부 에이전시로부터 독립적동심원 구조: Entities → U..
-
이코에코(Eco²) Deployment Strategy: Canary Deployments이코에코(Eco²) 2025. 12. 30. 22:10
2024-12-30 | 리팩토링을 앞두고 안전한 배포 전략 수립 TL;DR문제: 대규모 Clean Architecture 리팩토링을 안전하게 배포해야 함선택지: Rolling Update, Blue-Green, Canary결정: Canary 배포 (헤더 기반)이유: 기존 Istio 인프라 활용, 비용 효율성, 점진적 검증 가능1. 배경1.1 현재 상황도메인 서비스들의 Clean Architecture 리팩토링을 앞두고 있다. Auth 서비스를 시작으로 모든 도메인 서비스에 다음 변경이 예정되어 있다: 디렉토리 구조 전면 개편 (models/ → domain/entities/, services/ → application/commands/ 등) CQRS 패턴 도입 (Command/Query 분리) Re..
-
Blacklist에 Outbox 패턴을 도입하고 잠시 잡담잡담 2025. 12. 30. 18:44
ext-authz의 성능을 극대화하는 방향으로 기존 로그아웃 로직(Redis 직접 조회)을 로컬 캐시 조회로 수행하도록 디벨롭했다.위 작업이 기존의 Persistence Layer(Redis) 직접 접근과 동일하게 수행되려면 로컬 캐시와 레디스 간의 정합성을 맞춰야한다. 절차를 안내하면 아래와 같다.Logout 엔드포인트 호출Auth에서 Redis에 직접 접근해 Blacklist에 JWT 저장Logout Event 발행 (Publisher)RabbitMQ에서 Fanoutext-authz에서 Event 수신 (Subscriber)로컬 캐시 업데이트위 방식으로 Eventual Consistency를 구성하면, 대다수의 케이스에서 정합성이 유지가 된다. 성능은 RPS 기준 1200->1500으로 +25% 상승..
-
이코에코(Eco²) Eventual Consistency #4: Blacklist Relay Worker 구현이코에코(Eco²)/Eventual Consistency 2025. 12. 30. 15:35
1. 전체 디자인1.1 시스템 개요①auth-api → RabbitMQ정상 발행 (99%+)②auth-api → RedisMQ 실패 시 Outbox 적재③Redis → auth-relay1초마다 폴링④auth-relay → RabbitMQOutbox 이벤트 재발행⑤RabbitMQ → ext-authzFanout 브로드캐스트1.2 데이터 흐름단계컴포넌트동작①Redis BlacklistSETEX token:blacklist:{jti} {ttl}②Publisherbasic_publish() 시도③Outbox → Relay실패 시 LPUSH → RPOP → republish④RabbitMQFanout 브로드캐스트⑤ext-authzcache.Store(jti, entry) 2. 주요 컴포넌트2.1 컴포넌트 의존성..
-
이코에코(Eco²) Eventual Consistency #3: ext-authz 로컬 캐시 일관성 보장 설계이코에코(Eco²)/Eventual Consistency 2025. 12. 30. 15:12
1. 문제 정의1.1 현재 아키텍처에서 발생할 수 있는 불일치┌─────────────────────────────────────────────────────────────────────────────┐│ 현재 아키텍처 (Best Effort) │├─────────────────────────────────────────────────────────────────────────────┤│ ││ User Logout ..
-
Eventual Consistency 트러블슈팅: Character Rewards INSERT 멱등성 미보장 버그 픽스이코에코(Eco²)/Troubleshooting 2025. 12. 30. 14:32
날짜: 2025-12-30영향 범위: my.user_characters 테이블, 캐릭터 인벤토리 조회심각도: Medium (데이터 중복, UX 영향, 해결 전 표기 13/13)0. 부하테스트 수행 기록이 버그는 12월 28-29일간 집중 부하테스트 과정에서 발견.총 13회의 k6 부하테스트를 수행하며 Scan SSE 파이프라인의 성능을 검증했고, 그 과정에서 캐릭터 보상 중복 저장 문제가 발생.부하테스트 요약#VUsDurationScan TotalCompletion RateSuccess Rate11002m1,15096.0%100%21002m1,02098.5%100%32002m1,83199.8%100%42502m2,13199.9%100%53002m2,53899.9%100%64002m3,38598.2%100..
-
이코에코(Eco²) Eventual Consistency #2: ext-authz 2500 VUs 부하 테스트이코에코(Eco²)/Eventual Consistency 2025. 12. 30. 12:11
테스트 실행: Locust VUs 2500/ramp-ups: 250, Observability: Prometheus/Grafana, Locust 1. 테스트 환경https://snapshots.raintank.io/dashboard/snapshot/JbEhJRXD1vCt77ZOfCxy9N72wXJ3ZyKj 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 su..
-
이코에코(Eco²) Eventual Consistency #1: ext-authz Blacklist 로컬 캐시 및 Fanout 구현이코에코(Eco²)/Eventual Consistency 2025. 12. 30. 11:48
이전 글: ext-authz 로컬 캐싱 설계개요설계 문서에서 제안한 로컬 캐시 + MQ 브로드캐스트 아키텍처를 구현하고 검증한 과정을 기록합니다.1. 구현 결과 요약1.1 메트릭 검증ext_authz_blacklist_cache_size 7 ← 캐시에 7개 유지ext_authz_blacklist_cache_evictions_total 0 ← eviction 없음ext_authz_mq_events_received_total 1 ← MQ 이벤트 수신ext_authz_mq_events_processed_total 1 ← 처리 성공1.2 동작 흐름┌────────────────────────────────────────────────────..