인프런 커뮤니티 질문&답변
UserSignedUpEventConsumer 에서 로그 DB 저장 문의
작성
·
5
0
말씀해주신 것처럼 컨슈머 로직 안에 로그를 디비로 저장하는 부분이 비동기 처리를 하기 위해 kafka를 도입하는 것과 상충하지 않는지 의문입니다.
@Service
public class UserSignedUpEventConsumer {
private EmailLogRepository emailLogRepository;
public UserSignedUpEventConsumer(EmailLogRepository emailLogRepository) {
this.emailLogRepository = emailLogRepository;
}
@KafkaListener(
topics = "user.signed-up",
groupId = "email-service",
concurrency = "3"
)
@RetryableTopic(
attempts = "5",
backoff = @Backoff(delay = 1000, multiplier = 2),
dltTopicSuffix = ".dlt"
)
public void consume(String message) throws InterruptedException {
UserSignedUpEvent userSignedUpEvent = UserSignedUpEvent.fromJson(message);
String receiverEmail = userSignedUpEvent.getEmail();
String subject = userSignedUpEvent.getName() + "님, 회원 가입을 축하드립니다!";
Thread.sleep(3000);
System.out.println("이메일 발송 완료");
EmailLog emailLog = new EmailLog(
userSignedUpEvent.getUserId(),
receiverEmail,
subject
);
emailLogRepository.save(emailLog);
}
}
이 부분을 실무레벨에서 해결한다면 어떤 방법이 있는지 궁금합니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. luxleo님!
Kafka 컨슈머 로직에서 로그를 DB에 저장하는 부분이 비동기 처리를 목표로 하는 Kafka의 사용 목적과 상충할 수 있다는 의문을 가지고 계신 것 같습니다. DB에 동기적으로 저장하는 연산 때문에 전체 처리 속도가 저하될 수 있기 때문입니다. 이를 실무에서 해결하기 위한 방법에는 여러 가지 접근이 가능하며, 아래에 몇 가지 방향을 제안드립니다.
1. 비동기 저장 방식 사용
- 비동기 처리를 위한 메시지 큐 사용: 이메일 발송 로그를 직접 DB에 저장하는 대신, 별도의 메시지 큐(Kafka나 RabbitMQ 등)를 사용하여 로그 저장 요청을 큐에 쌓고, 이를 처리하는 별도의 컨슈머가 비동기적으로 DB에 저장하도록 설계할 수 있습니다. 이를 통해 처리량이 많은 경우에도 빠르게 반응할 수 있습니다.
2. 배치 처리
- 배치로 로그 저장: 일정량의 로그가 쌓이면 한 번에 DB에 저장하는 배치 처리를 통해 성능을 최적화할 수 있습니다. 이는 DB로의 네트워크 호출을 줄여주고, 부하를 더 예측 가능한 수준으로 유지할 수 있게 됩니다.
3. 개선된 DB 설정 및 사용
- DB 트랜잭션 및 연결 최적화: 데이터베이스 연결 설정을 최적화하거나, 고성능 DB 인스턴스를 사용하여 저장 시간을 단축할 수 있습니다. 이를 통해 이메일 로그 저장 시의 오버헤드를 줄일 수 있습니다.
4. 캐싱 사용
- 로그 캐싱: 실제 DB에 저장하기 전에 메모리나 Redis 같은 인메모리 데이터 저장소에 임시로 저장하여 동시성 처리 능력을 높일 수 있습니다. 캐싱을 통해 실시간 조회 성능과 병목 문제를 해소할 수 있습니다.
추가 자료
위에서 제안한 방법들은 각각의 장단점이 있으므로, 실제 시스템의 요구사항과 상황에 맞춰 선택하는 것이 중요합니다. 관련된 좀 더 심화된 적용 사례는 아래 유사한 질문에서 찾을 수 있습니다:
이 정보들이 luxleo님의 시스템 설계와 성능 최적화에 도움이 되기를 바랍니다. 현재 베타 기능으로서 만족스럽지 않을 수 있습니다만, 추가적으로 궁금하신 점이 있다면 언제든지 이어서 질문해 주세요. 곧 지식공유자께서 자세히 답변해 주실 것입니다. 🙏




