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

SJ님의 프로필 이미지

작성한 질문수

실습으로 배우는 선착순 이벤트 시스템

Producer 사용하기

consumer 셋팅 숫자 출력이 안됩니다.

24.05.04 11:58 작성

·

269

·

수정됨

0

docker exec -it kafka kafka-console-consumer.sh --topic coupon_create --bootstrap-server localhost:9092 --key-deserializer "org.apache.kafka.common.serialization.StringDeserializer" --value-deserializer "org.apache.kafka.common.serialization.LongDeserializer"


라고 터미너에 입력한 후에 테스트 코드

package com.example.coupon_server.service;

import com.example.coupon_server.repository.CouponRepository;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import static org.assertj.core.api.AssertionsForClassTypes.assertThat;

@SpringBootTest
public class ApplyServiceTest {

    @Autowired
    private ApplyService applyService;

    @Autowired
    private CouponRepository couponRepository;

    @Test
    @DisplayName("쿠폰 한개 적용 테스트")
    public void applyOneCoupon() {
        applyService.applyCoupon(1L);

        long count = couponRepository.count();

        assertThat(count).isEqualTo(1);
    }

    @Test
    @DisplayName("쿠폰 여러개 적용 테스트")
    public void applyMultiCoupon() throws InterruptedException {
        int threadCount = 1000;
        ExecutorService executorService = Executors.newFixedThreadPool(32);
        CountDownLatch latch = new CountDownLatch(threadCount);

        for (int i = 0; i < threadCount; i++) {
            long userId = i;
            executorService.submit(() -> {
                try {
                    applyService.applyCoupon(userId);
                } finally {
                    latch.countDown();
                }
            });
        }

        latch.await();

        Thread.sleep(10000);

        long count = couponRepository.count();
        assertThat(count).isEqualTo(100);
    }

    @Test
    @DisplayName("한명당 한개의 쿠폰만 발급")
    public void applyOneCouponPerUser() throws InterruptedException {
        int threadCount = 1000;
        ExecutorService executorService = Executors.newFixedThreadPool(32);
        CountDownLatch latch = new CountDownLatch(threadCount);

        for (int i = 0; i < threadCount; i++) {
            long userId = i;
            executorService.submit(() -> {
                try {
                    applyService.applyCoupon(1L);
                } finally {
                    latch.countDown();
                }
            });
        }

        latch.await();

        Thread.sleep(10000);

        long count = couponRepository.count();
        assertThat(count).isEqualTo(1);
    }
}

로 작성했지만 터미널에서 강사님과 같이 숫자들이 찍히자 않습니다.

그리고 터미널 안의 글씨 너무 작은것 같아요

답변 2

0

최상용님의 프로필 이미지
최상용
지식공유자

2024. 05. 07. 14:05

SJ 님 안녕하세요.
해당 코드만 보고 문제를 파악하기는 어려울 것 같습니다.
전체 코드를 깃헙에 올려주신 후 주소를 공유해주실 수 있으실까요 ?

0

인프런 AI 인턴님의 프로필 이미지

2024. 05. 04. 12:01

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

SJ님, Kafka Consumer 설정과 관련하여 숫자가 출력되지 않는 문제를 겪고 계신 것 같습니다. 또한, 터미널의 글씨 크기에 대한 언급도 있으셨네요. 터미널의 글씨 크기 조정은 사용하시는 터미널 또는 콘솔 애플리케이션의 설정에서 조절할 수 있으니 해당 애플리케이션의 문서를 참조하시는 것이 좋겠습니다.

Consumer에서 숫자가 출력되지 않는 문제에 집중해보겠습니다. 이와 유사한 문제에 대한 해결 방법을 공유드린 경우가 있어 관련 내용을 안내드립니다. 주어진 설명에 의하면, Kafka Consumer 설정에 문제가 있을 가능성이 높아 보입니다. 특히, --key-deserializer--value-deserializer 설정을 정확히 하셨는지, 그리고 Kafka Producer에서 메시지를 제대로 publish하였는지 확인해보셔야 할 것 같습니다.

유사한 상황에 대한 답변 링크는 다음과 같습니다:
- “consumer에서 숫자가 출력되지 않습니다ㅠ”에 대한 해결책

이 답변에서는 Consumer에서 데이터가 출력되지 않는 주요 원인으로 Serializer 설정의 문제를 지적하고 있습니다. Producer 측에서 설정한 Serializer와 Consumer 측에서 설정한 Deserializer가 일치하는지 확인해보시기 바랍니다.

Kafka에서 데이터 통신 시, 데이터의 직렬화(Serialization)와 역직렬화(Deserialization) 방법이 일치하지 않으면 올바르게 데이터를 주고받을 수 없습니다. 특히, Producer와 Consumer 사이에서 보내는 키와 값의 데이터 타입이 일치해야 합니다.

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

SJ님의 프로필 이미지

작성한 질문수

질문하기