작성
·
23
0
consumer 쪽에서 이메일 발송 로직 대신 Thread.sleep(3000)
을 써주셨는데요.
이 말은, consumer 쓰레드 자체에서 이메일 보내는 로직을 실행한다고 가정해서 그런거라고 이해했습니다.
개인적으로 consumer 는 message 를 consume 만 하고, 실제 비즈니스 로직 (email send) 는 별개의 쓰레드로 async 하게 동작하는게 더 효율적이라고 생각이 되는데요.
email 발송 로직을 별개의 쓰레드로 할 때와 현재처럼 consumer 쓰레드에서 할 때 차이점 및 주의해야할 점 (ex. offset 수동 커밋 등) 이 있을까요?
답변 2
1
안녕하세요 ! 질문 잘해주셨어요 ~
질문해 주신 내용에 대해 답변드려 볼게요 !
우선 말씀해 주신 대로 Consumer가 메시지를 consume만 하고,
실제 비즈니스 로직은 별개의 스레드로 async하게 처리하는 방식이
유의미한 성능 차이가 발생하진 않을 수 있습니다!
비동기로 이메일 발송을 처리한다고 하더라도
이메일 발송 처리가 완료된 이후에 커밋을 해야 하기 때문에
결국 쓰레드가 작업을 계속 물고 있어야 하는 것에는 변함이 없습니다!
그러다보니 불필요한 async 처리는 성능 향상은 없이 복잡성만 가중 시킬 수 있습니다~!!
제가 질문을 잘 이해하지 못한 것일 수도 있으니
원하시는 답변이 아니라면 대략적인 예시 코드랑 같이
추가 질문 부탁드리겠습니다~!!
0
안녕하세요, 인프런 AI 인턴입니다. writer0713님.
Kafka Consumer에서 메시지를 처리하는 방식에 대해 질문 주셨군요. 이메일 발송과 같은 I/O 작업은 비즈니스 로직의 처리 속도를 저하시킬 수 있기 때문에, 이를 어떻게 처리할 것인지에 대한 전략이 매우 중요합니다. 아래는 각각의 방식과 그 차이점, 그리고 주의점에 대한 설명입니다.
장점: Consumer는 메시지를 빠르게 소비하면서, 실제 작업은 별도의 스레드(혹은 스레드 풀)로 처리하므로 전체 처리량을 향상시킬 수 있습니다.
단점: 메시지가 정상적으로 처리되었는지 확인한 후에 오프셋을 커밋해야 하므로, offset commit의 시점과 방식에 대한 추가적인 관리가 필요합니다. 이는 메시지의 손실이나 중복 처리의 원인이 될 수 있습니다.
@Async
또는 비동기 작업 큐(예: Spring Batch, Message Queue)를 고려해 볼 수 있습니다.관련된 실무적 사례 및 추가 정보는 아래 유사한 질문 링크를 참고하시면 도움이 될 것입니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
아, 그러네요. 결국 별도 쓰레드로 async 하게 처리한다 하더라도 이메일 전송 완료 후에 offset commig 을 수동으로 해줘야 하니 성능적인 차이로 이어지진 않겠군요. 감사합니다!