작성
·
34
0
이전에 컨슈머 서버 ( email-send-consumer ) 에서는 문제가없었는데
마지막 email-service에서는2025-08-28T23:50:12.394+09:00 INFO 40252 --- [ner#0.dlt-0-C-1] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-email-service.dlt-29, groupId=email-service.dlt] Discovered group coordinator 13.209.11.23:9092 (id: 2147483646 rack: null)
2025-08-28T23:50:12.394+09:00 INFO 40252 --- [ner#0.dlt-0-C-1] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-email-service.dlt-29, groupId=email-service.dlt] Request joining group due to: rebalance failed due to 'The coordinator is not available.' (CoordinatorNotAvailableException)
2025-08-28T23:50:12.396+09:00 INFO 40252 --- [ner#0.dlt-2-C-1] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-email-service.dlt-31, groupId=email-service.dlt] Discovered group coordinator 13.209.11.23:9092 (id: 2147483646 rack: null)
2025-08-28T23:50:12.396+09:00 INFO 40252 --- [ner#0.dlt-1-C-1] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-email-service.dlt-30, groupId=email-service.dlt] (Re-)joining group
2025-08-28T23:50:12.396+09:00 INFO 40252 --- [ner#0.dlt-2-C-1] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-email-service.dlt-31, groupId=email-service.dlt] Request joining group due to: rebalance failed due to 'The coordinator is not available.' (CoordinatorNotAvailableException)
2025-08-28T23:50:12.399+09:00 INFO 40252 --- [ner#0.dlt-0-C-1] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-email-service.dlt-29, groupId=email-service.dlt] (Re-)joining group
2025-08-28T23:50:12.401+09:00 INFO 40252 --- [ner#0.dlt-2-C-1] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-email-service.dlt-31, groupId=email-service.dlt] (Re-)joining group
2025-08-28T23:50:12.411+09:00 INFO 40252 --- [ner#0.dlt-1-C-1] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-email-service.dlt-30, groupId=email-service.dlt] Successfully joined group with generation Generation{generationId=261, memberId='consumer-email-service.dlt-30-5a032e9e-a903-4fb7-9004-487d74eb6c79', protocol='range'}
2025-08-28T23:50:12.411+09:00 INFO 40252 --- [ner#0.dlt-2-C-1] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-email-service.dlt-31, groupId=email-service.dlt] Successfully joined group with generation Generation{generationId=261, memberId='consumer-email-service.dlt-31-0cdcda6c-6ddf-4e0b-980a-868f587ed2bd', protocol='range'}
2025-08-28T23:50:12.411+09:00 INFO 40252 --- [ner#0.dlt-0-C-1] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-email-service.dlt-29, groupId=email-service.dlt] Successfully joined group with generation Generation{generationId=261, memberId='consumer-email-service.dlt-29-2b16177f-2cc3-44c0-b244-50109078218e', protocol='range'}
2025-08-28T23:50:12.411+09:00 INFO 40252 --- [ner#0.dlt-1-C-1] o.a.k.c.c.internals.ConsumerCoordinator : [Consumer clientId=consumer-email-service.dlt-30, groupId=email-service.dlt] Finished assignment for group at generation 261: {consumer-email-service.dlt-31-0cdcda6c-6ddf-4e0b-980a-868f587ed2bd=Assignment(partitions=[]), consumer-email-service.dlt-29-2b16177f-2cc3-44c0-b244-50109078218e=Assignment(partitions=[user.signed-up.dlt-0]), consumer-email-service.dlt-30-5a032e9e-a903-4fb7-9004-487d74eb6c79=Assignment(partitions=[])}
...
이런식으로 계속 로그가 반복됩니다
프로듀서에 발행은 완료됐고 cli에서 메세지도 확인했는데
컨슈머서버에서 저렇게 자꾸 정상적으로 작동을 하지않습니다
@Service
public class UserSignedUpEventConsumer {
private final 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), // 1 초 2초 4초 8초 16초 5번
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);
}
강사님 코드랑 이전 email-send-consumer 서비스 코드 및 야믈파일도 몇번 확인했는데 다른점이 없습니다 왜그런걸까요
답변 4
0
안녕하세요 ! 질문 잘해주셨어요 ~
보내주신 로그들 토대로 디버깅 도와드려볼게요 !
로그를 보니 13.209.11.23:9092에 계속 접속을 시도하고 있는데,
이 브로커가 응답하지 않는 상황인 것 같네요 !
아래 과정들을 통해 차례대로 디버깅해보시는걸 추천드려요 ~
[1] 브로커 상태 확인
먼저 Kafka 브로커들이 정상적으로 실행되고 있는지 확인해보세요!
각 EC2에서 docker ps
로 Kafka 컨테이너가 잘 돌고 있는지 체크해보시고,
docker logs [컨테이너명]
으로 에러가 없는지 확인해보시는걸 추천드려요 !
[2] 네트워크 연결 확인
컨슈머 서버에서 브로커 IP로 실제 접속이 되는지 확인해보세요!
telnet 13.209.11.23 9092
명령어로 포트가 열려있는지 테스트해보시는걸 추천드려요 !
[3] application.yml 설정 재확인
bootstrap-servers 설정이 정확한지 다시 한번 확인해보세요!
혹시 IP 주소나 포트 번호에 오타가 있을 수도 있어요 ~
가장 가능성이 높은 건 브로커 중 하나가 제대로 실행되지 않았거나,
네트워크 연결에 문제가 있는 상황인 것 같네요!
위 과정으로 디버깅 해보시고, 어떤 게 문제인지 파악이 안 되실 경우 또 질문 남겨주세요~~ 😄
0
안녕하세요 나마스테님! 질문 잘 해주셨습니다:)
제가 휴가 중이라 질문을 늦게 확인했네요ㅠㅠ!
가능하다면 오늘 밤 중이나 내일 오전 전까지
질문해주신 내용에 대해 답변 남겨놓겠습니다!!
0
AI도 그렇고 gpt도 그렇고 컨슈머 그룹 ID 를 동일하게 쓰면안된다고하는데 강사님 영상이나 pdf에서 둘다 그룹id똑같이 쓴것같아서 추가로 댓글 남깁니다
@KafkaListener( topics = "user.signed-up", groupId = "email-service", concurrency = "3" )
=====dlt====
@KafkaListener(
topics = "user.signed-up.dlt",
groupId = "email-service"
)
0
안녕하세요, 인프런 AI 인턴입니다. 나마스테님!
Kafka Consumer에서 무한 리로드 문제를 겪고 계신 것 같네요. 이는 주로 Kafka 컨슈머 그룹이 코디네이터를 찾지 못하거나, 컨슈머 그룹 간 조정이 제대로 이루어지지 않을 때 발생할 수 있습니다. 또한, 특정 설정 문제나 네트워크 문제도 원인일 수 있습니다. 이 문제를 해결하기 위해 다음 사항들을 점검해 보세요.
오프셋 문제 확인:
컨슈머 그룹 ID 확인:
groupId
가 정상적으로 설정되어 있는지 확인하세요. 만약 동일한 그룹 ID를 여러 컨슈머에서 사용하고 있다면 브로커 간 충돌이 생길 수 있습니다.코디네이터 가용성 문제 극복:
ConsumerCoordinator 관련 오류 메시지는 컨슈머 그룹 코디네이터를 찾지 못하거나 사용자가 감지할 수 없는 네트워크 이슈로 인해 발생할 수 있습니다. 이 경우 Kafka 클러스터의 네트워크 설정을 확인하세요.
특히, 설정 파일에 정의된 bootstrap.servers
의 호스트와 포트가 올바른지 확인하세요.
재시도 로직 확인:
@RetryableTopic
의 설정을 확인하여, 재시도 시 컨슈머가 설정된 대로 동작하고 있는지 확인하세요. 무한 루프가 설정 때문인지 확인이 필요합니다. 특히 backoff
와 attempts
설정이 실제로 의도한 대로 동작하는지 로그를 통해 확인해 보세요.성공적인 메시지 처리 검토:
위의 방법들로 해결이 되지 않는다면, 아래 유사한 질문들을 확인하여 다른 개발자들의 해결 방안을 참고하셔도 좋습니다:
이 정보가 문제 해결에 도움이 되기를 바라며, 질문자님의 이해를 돕기 위해 유사한 질문 및 답변 링크를 제공하였습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시다면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
안녕하세요! 예리하게 잘 질문 해주셨네요 !
우선 실무에서는 말씀해 주신대로 메인 토픽과
DLT 토픽은 groupId를 다르게 쓰는 게 정석이에요 !
같은 groupId를 사용하면 Kafka가 두 컨슈머를 같은 그룹으로 인식해서
파티션을 나눠서 할당하려고 시도해요 !
그런데 원본 토픽과 DLT 토픽은 완전히 다른 토픽이라서
파티션 할당에서 충돌이 생길수 있기 때문이죠 !
강의에서는 Kafka 구조와 동작흐름을 보여주는게 핵심이라,
학습의 단순화를 위해서 일부러 동일한 groupId를 사용했었어요 ~
참고로 강의 예제에서는 단일 서비스(email-service) 안에서
메인 토픽과 DLT 토픽을 함께 소비하는 구조라서, 단순히 묶어도 동작은 했던 거였어요 !
실제 프로젝트에서는 서비스 규모, 메시지 처리량, 팀 구조에 따라
이런 설계 결정을 다르게 내리게 되실 거예요~
정답이 딱 정해져 있는 건 아니라서, 상황에 맞는 최적의 선택을 하시면 됩니다!
궁금한 점 더 있으시면 언제든 질문 남겨주세요~~