강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

luxleo님의 프로필 이미지
luxleo

작성한 질문수

실전에서 바로 써먹는 Kafka 입문

[실습] 이메일 발송을 처리할 Consumer 로직 짜기

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님의 시스템 설계와 성능 최적화에 도움이 되기를 바랍니다. 현재 베타 기능으로서 만족스럽지 않을 수 있습니다만, 추가적으로 궁금하신 점이 있다면 언제든지 이어서 질문해 주세요. 곧 지식공유자께서 자세히 답변해 주실 것입니다. 🙏

luxleo님의 프로필 이미지
luxleo

작성한 질문수

질문하기