inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

Producer 사용하기

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

458

SJ

작성한 질문수 155

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);
    }
}

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

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

java docker spring-boot kafka redis

답변 3

0

huhjb1020

redis 값이 100을 이미 넘고 있는 건 아닌지 System.out.println(count)로 한번 출력해보세요.

flushall해도 0이 안되길래... p3x redis ui 접속 툴로 확인해보니 coupon_count값이 100이 이미 넘고 있었어요..! redis-cli에서는 keys * 검색해도 안뜨던게 떠있어서 접속툴에서 지우고 하니 되더라구요..!

0

최상용

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

0

인프런 AI 인턴

안녕하세요, 인프런 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 사이에서 보내는 키와 값의 데이터 타입이 일치해야 합니다.

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

ApplyService와 Consumer서비스의 db공유?

0

58

2

consumer가 topic을 전부 사용하기 전에 사용자에게는 쿠폰이 발급된것으로 확인하는 과정에서 발생가능한 문제.

0

80

1

쿠폰에 관련되어서 좀 더 참고할만한 자료가 있을까요?

0

95

2

흐름정리 제가 이해한게 맞나요?

0

79

2

안되서 스트레스 받아요

-2

116

2

프로젝트 진행할때 모듈로 추가하는 이유가 궁금합니다!

0

188

2

Redis 활용하기 문제점 해결하기 부분이 이해가 잘 안됩니다...

0

219

1

카프카를 도입하고 난 뒤 로그로 보여지는 장점을 발견하지 못하고 있습니다.

0

172

2

키생성 방식에 따른 성능

0

170

2

사용자 동선에 대한 트랜잭션 문의

0

137

2

강사님 강의를 듣고 실제 프로젝트에서 이벤트 응모 시스템을 만들어 봤습니다.

0

212

1

쿠폰 발급 개수 제한

0

187

2

ApplyService 의 총 처리 시간이 궁금합니다.

0

156

1

쿠폰 생성 에러 처리에 관해서 질문이 있습니다.

0

226

2

마지막에 하신 테스트 자체는 실패하는 게 맞는거죠??

0

280

2

안녕하세요 질문 있습니다!

0

300

1

쿠폰 발급 유저 흐름에 대한 질문

0

310

2

수량 조절에 대한 질문이 있습니다.

0

235

2

kafka Producer 실행 중 에러 시 redis count 정합성 이슈

0

402

2

test 과정에서 오류가 발생합니다.

0

386

1

도커 환경설정에 대해서

0

271

2

Redis의 INCR 사용 해도 Race condition이 잡히지 않는 문제

0

601

1

consumer 모듈

0

327

2

카프카 토픽 생성오류

0

387

2