강의

멘토링

로드맵

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

writer0713님의 프로필 이미지
writer0713

작성한 질문수

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

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

email 발송 로직 관련

작성

·

23

0

consumer 쪽에서 이메일 발송 로직 대신 Thread.sleep(3000) 을 써주셨는데요.

이 말은, consumer 쓰레드 자체에서 이메일 보내는 로직을 실행한다고 가정해서 그런거라고 이해했습니다.

 

개인적으로 consumer 는 message 를 consume 만 하고, 실제 비즈니스 로직 (email send) 는 별개의 쓰레드로 async 하게 동작하는게 더 효율적이라고 생각이 되는데요.

 

email 발송 로직을 별개의 쓰레드로 할 때와 현재처럼 consumer 쓰레드에서 할 때 차이점 및 주의해야할 점 (ex. offset 수동 커밋 등) 이 있을까요?

답변 2

1

JSCODE 박재성님의 프로필 이미지
JSCODE 박재성
지식공유자

안녕하세요 ! 질문 잘해주셨어요 ~

질문해 주신 내용에 대해 답변드려 볼게요 !

 

우선 말씀해 주신 대로 Consumer가 메시지를 consume만 하고,

실제 비즈니스 로직은 별개의 스레드로 async하게 처리하는 방식이

유의미한 성능 차이가 발생하진 않을 수 있습니다!

비동기로 이메일 발송을 처리한다고 하더라도

이메일 발송 처리가 완료된 이후에 커밋을 해야 하기 때문에

결국 쓰레드가 작업을 계속 물고 있어야 하는 것에는 변함이 없습니다!

그러다보니 불필요한 async 처리는 성능 향상은 없이 복잡성만 가중 시킬 수 있습니다~!!

 

제가 질문을 잘 이해하지 못한 것일 수도 있으니

원하시는 답변이 아니라면 대략적인 예시 코드랑 같이

추가 질문 부탁드리겠습니다~!!

writer0713님의 프로필 이미지
writer0713
질문자

아, 그러네요. 결국 별도 쓰레드로 async 하게 처리한다 하더라도 이메일 전송 완료 후에 offset commig 을 수동으로 해줘야 하니 성능적인 차이로 이어지진 않겠군요. 감사합니다!

0

안녕하세요, 인프런 AI 인턴입니다. writer0713님.

Kafka Consumer에서 메시지를 처리하는 방식에 대해 질문 주셨군요. 이메일 발송과 같은 I/O 작업은 비즈니스 로직의 처리 속도를 저하시킬 수 있기 때문에, 이를 어떻게 처리할 것인지에 대한 전략이 매우 중요합니다. 아래는 각각의 방식과 그 차이점, 그리고 주의점에 대한 설명입니다.

1. Consumer 쓰레드에서 직접 처리하는 방식

  • 장점: 코드가 단순하고 구현이 쉬운 편입니다. 추가적인 비동기 처리나 호출 관리를 위한 코드 작성이 필요 없습니다.
  • 단점: I/O 작업(예: 이메일 발송)의 지연이 발생하면, Consumer 쓰레드가 블로킹되면서 다른 메시지를 처리할 수 없습니다. 이는 전체 시스템의 메시지 처리량 감소로 이어질 수 있습니다.

2. 비즈니스 로직을 별도의 쓰레드로 처리하는 방식

  • 장점: Consumer는 메시지를 빠르게 소비하면서, 실제 작업은 별도의 스레드(혹은 스레드 풀)로 처리하므로 전체 처리량을 향상시킬 수 있습니다.

  • 단점: 메시지가 정상적으로 처리되었는지 확인한 후에 오프셋을 커밋해야 하므로, offset commit의 시점과 방식에 대한 추가적인 관리가 필요합니다. 이는 메시지의 손실이나 중복 처리의 원인이 될 수 있습니다.

    • 주의사항:
      • Offset 수동 커밋: 메시지가 성공적으로 처리된 후 오프셋을 명시적으로 커밋해야 합니다. 예외 발생 시 적절한 예외 처리를 통해 메시지의 중복 소비를 방지해야 합니다.
      • 스레드 안전성: Shared resources(예: 데이터베이스 연결, 파일 등)를 사용할 경우 스레드 안전성을 고려해야 합니다.

추천 방식

  • 비즈니스 로직이 무거운 작업(예: 대규모 I/O, 긴 계산 시간이 필요한 작업 등)일 경우, 비동기 처리 방식이 시스템의 전체 효율성을 높이므로 권장됩니다.
  • Spring의 @Async 또는 비동기 작업 큐(예: Spring Batch, Message Queue)를 고려해 볼 수 있습니다.

관련된 실무적 사례 및 추가 정보는 아래 유사한 질문 링크를 참고하시면 도움이 될 것입니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

writer0713님의 프로필 이미지
writer0713

작성한 질문수

질문하기