MAKITTDocs

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토픽설명
EmailNotificationConsumermakitt.notification.email이메일 발송
InAppNotificationConsumermakitt.notification.inapp인앱 알림
ArgoSkuSyncConsumercms-sku-info-changeArgo SKU 동기화

관련 코드

파일역할
makitt-core/.../redis/ConsumerToggleService.javashouldProcess() 로직
makitt-core/.../redis/RedisKeyValueService.java범용 Redis key-value 서비스
makitt-api/.../admin/AdminRedisController.javaAdmin REST API (GET/POST/DELETE)

참고: Kafka를 거치는 Flow vs 직접 호출 Flow

기능방식consumer toggle 적용
회원가입 인증 이메일Kafka (비동기)O
로그인 이메일직접 호출 (동기)X — consumer 안 거침
인앱 알림Kafka (비동기)O
Argo SKU 동기화Kafka (비동기)O