Inflearn brand logo image

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

나마스테님의 프로필 이미지
나마스테

작성한 질문수

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

[실습] 잘 작동하는 지 테스트해보기

섹션7 51 컨슈머서버 무한 리로드?

작성

·

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

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

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

보내주신 로그들 토대로 디버깅 도와드려볼게요 !

로그를 보니 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

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

안녕하세요 나마스테님! 질문 잘 해주셨습니다:)

제가 휴가 중이라 질문을 늦게 확인했네요ㅠㅠ!

가능하다면 오늘 밤 중이나 내일 오전 전까지

질문해주신 내용에 대해 답변 남겨놓겠습니다!!

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"
)

 

 

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

안녕하세요! 예리하게 잘 질문 해주셨네요 !

 

우선 실무에서는 말씀해 주신대로 메인 토픽과

DLT 토픽은 groupId를 다르게 쓰는 게 정석이에요 !

같은 groupId를 사용하면 Kafka가 두 컨슈머를 같은 그룹으로 인식해서

파티션을 나눠서 할당하려고 시도해요 !

 

그런데 원본 토픽과 DLT 토픽은 완전히 다른 토픽이라서

파티션 할당에서 충돌이 생길수 있기 때문이죠 !

강의에서는 Kafka 구조와 동작흐름을 보여주는게 핵심이라,

학습의 단순화를 위해서 일부러 동일한 groupId를 사용했었어요 ~

 

참고로 강의 예제에서는 단일 서비스(email-service) 안에서

메인 토픽과 DLT 토픽을 함께 소비하는 구조라서, 단순히 묶어도 동작은 했던 거였어요 !

실제 프로젝트에서는 서비스 규모, 메시지 처리량, 팀 구조에 따라

이런 설계 결정을 다르게 내리게 되실 거예요~

 

정답이 딱 정해져 있는 건 아니라서, 상황에 맞는 최적의 선택을 하시면 됩니다!

궁금한 점 더 있으시면 언제든 질문 남겨주세요~~

0

안녕하세요, 인프런 AI 인턴입니다. 나마스테님!

Kafka Consumer에서 무한 리로드 문제를 겪고 계신 것 같네요. 이는 주로 Kafka 컨슈머 그룹이 코디네이터를 찾지 못하거나, 컨슈머 그룹 간 조정이 제대로 이루어지지 않을 때 발생할 수 있습니다. 또한, 특정 설정 문제나 네트워크 문제도 원인일 수 있습니다. 이 문제를 해결하기 위해 다음 사항들을 점검해 보세요.

해결 방안:

  1. 오프셋 문제 확인:

    • 오류 발생 시 컨슈머가 오프셋 문제로 인해 메시지를 정상적으로 처리하지 못하는 경우일 수 있습니다. Kafka 관리툴(Kafka manager 등)을 통해 특정 메시지 오프셋에 문제가 없는지 확인해 보세요.
  2. 컨슈머 그룹 ID 확인:

    • groupId가 정상적으로 설정되어 있는지 확인하세요. 만약 동일한 그룹 ID를 여러 컨슈머에서 사용하고 있다면 브로커 간 충돌이 생길 수 있습니다.
  3. 코디네이터 가용성 문제 극복:

    • ConsumerCoordinator 관련 오류 메시지는 컨슈머 그룹 코디네이터를 찾지 못하거나 사용자가 감지할 수 없는 네트워크 이슈로 인해 발생할 수 있습니다. 이 경우 Kafka 클러스터의 네트워크 설정을 확인하세요.

    • 특히, 설정 파일에 정의된 bootstrap.servers의 호스트와 포트가 올바른지 확인하세요.

  4. 재시도 로직 확인:

    • @RetryableTopic의 설정을 확인하여, 재시도 시 컨슈머가 설정된 대로 동작하고 있는지 확인하세요. 무한 루프가 설정 때문인지 확인이 필요합니다. 특히 backoffattempts 설정이 실제로 의도한 대로 동작하는지 로그를 통해 확인해 보세요.
  5. 성공적인 메시지 처리 검토:

    • 메시지가 성공적으로 처리된 후 log 및 commit이 정상적으로 이루어졌는지 확인하셔야 합니다. 오프셋이 정상적으로 커밋되지 못할 경우, 무한 대기 상태에 빠질 수 있습니다.

추가 자료:

위의 방법들로 해결이 되지 않는다면, 아래 유사한 질문들을 확인하여 다른 개발자들의 해결 방안을 참고하셔도 좋습니다:

이 정보가 문제 해결에 도움이 되기를 바라며, 질문자님의 이해를 돕기 위해 유사한 질문 및 답변 링크를 제공하였습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시다면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

나마스테님의 프로필 이미지
나마스테

작성한 질문수

질문하기