Consumer Toggle — 로컬/Dev 환경 분리
docs/reference/consumer-toggle.md
Consumer Toggle — 로컬/Dev 환경 분리
개요
Kafka consumer가 로컬과 dev에서 동시에 같은 브로커를 바라볼 때, Redis 기반 토글로 어느 환경의 consumer가 메시지를 처리할지 제어한다.
구조
Redis Key: makitt:consumer:active
Values: "dev" (기본) | "local" | "all"
- key 없음 / "dev": dev consumer만 처리, local은 skip
- "local": local consumer만 처리, dev는 skip
- "all": 양쪽 다 처리 (테스트용, 이메일 등 중복 주의)
사전 조건
로컬 Consumer Group 분리
makitt-consumer/src/main/resources/application-local.yml에 별도 group id가 설정되어 있어야 한다:
kafka: makitt: consumer: group-id: makitt-server-local
이렇게 하면:
- dev consumer:
makitt-server-dev(배포 환경) - local consumer:
makitt-server-local(로컬)
다른 group이므로 같은 메시지를 양쪽 다 수신. 토글이 어느 쪽에서 실제로 처리할지를 결정.
사용법
Admin API로 제어
# 상태 확인 curl http://localhost:8080/api/v1/admin/redis/consumer:active # 로컬 테스트 시작 (1시간 TTL — 잊어버려도 자동 복구) curl -X POST http://localhost:8080/api/v1/admin/redis \ -H "Content-Type: application/json" \ -d '{"key":"consumer:active","value":"local","ttlSeconds":3600}' # 테스트 끝 (dev로 즉시 복구) curl -X DELETE http://localhost:8080/api/v1/admin/redis/consumer:active # 양쪽 다 처리 (중복 발송 테스트용) curl -X POST http://localhost:8080/api/v1/admin/redis \ -H "Content-Type: application/json" \ -d '{"key":"consumer:active","value":"all","ttlSeconds":1800}'
일반적인 로컬 테스트 플로우
# 1. 로컬 consumer 띄우기 makitt-tmux consumer # 2. 토글을 local로 전환 curl -X POST http://localhost:8080/api/v1/admin/redis \ -H "Content-Type: application/json" \ -d '{"key":"consumer:active","value":"local","ttlSeconds":3600}' # 3. 테스트 수행 (회원가입 등 Kafka 이벤트 트리거) # 4. 로그 확인 tail -f /tmp/makitt-consumer.log | grep "\[Email\]" # 5. 끝나면 키 삭제 (또는 TTL 만료 대기) curl -X DELETE http://localhost:8080/api/v1/admin/redis/consumer:active
안전장치
- TTL 필수:
local로 설정할 때 반드시ttlSeconds를 포함. 잊어버려도 자동 만료 후 dev가 다시 처리. - 기본값 "dev": key가 없으면 dev가 처리. 설정을 안 하면 dev 환경에 영향 없음.
- ack 처리: skip하는 consumer도
ack.acknowledge()를 호출하므로 메시지가 쌓이지 않음.
적용된 Consumer
| Consumer | 토픽 | 설명 |
|---|---|---|
EmailNotificationConsumer | makitt.notification.email | 이메일 발송 |
InAppNotificationConsumer | makitt.notification.inapp | 인앱 알림 |
ArgoSkuSyncConsumer | cms-sku-info-change | Argo SKU 동기화 |
관련 코드
| 파일 | 역할 |
|---|---|
makitt-core/.../redis/ConsumerToggleService.java | shouldProcess() 로직 |
makitt-core/.../redis/RedisKeyValueService.java | 범용 Redis key-value 서비스 |
makitt-api/.../admin/AdminRedisController.java | Admin REST API (GET/POST/DELETE) |
참고: Kafka를 거치는 Flow vs 직접 호출 Flow
| 기능 | 방식 | consumer toggle 적용 |
|---|---|---|
| 회원가입 인증 이메일 | Kafka (비동기) | O |
| 로그인 이메일 | 직접 호출 (동기) | X — consumer 안 거침 |
| 인앱 알림 | Kafka (비동기) | O |
| Argo SKU 동기화 | Kafka (비동기) | O |