묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실습으로 배우는 선착순 이벤트 시스템
프로젝트셋팅
안녕하세요 강의 잘 듣고있습니다.설정 하실때 ,api 와 consumer 두개로 나눠서 하셨는데 ,하나의 src 밑에 있는 프로젝트로 진행을 할수가 있을까요 ?? 코드를 봤는데 중복된게 많아서 api 와 consumer 로 나누지 않고 하나의 src 밑에서 작성해도 되지않을까 생각했습니다.
-
미해결실습으로 배우는 선착순 이벤트 시스템
test 오류 발생하는 분들을 위한 해결 방법!
test를 돌릴 때, kafka consumer가 반응을 하지 않으면 이전 테스트에서 사용한 값 때문일 수도 있습니다! 저 같은 경우는 테스트가 순식간에 끝나버려서 의심을 했는데요.redis-cli에 접속하신 뒤 `flushall` 명령어를 친 뒤에 테스트를 진행해보시면 해결 됩니다!
-
해결됨실전! Redis 활용
데이터 타입 활용 - 온라인 상태 표시 [Bitmap] 관련 질문
안녕하세요. 강의를 잘 보고 있는 와중에 온라인 상태 표시 관련한 궁금증이 생겨서 질문을 남기게 됐습니다. (※ 다른 분이 남겨주신 온라인 상태 표시 질문 글도 읽었습니다.) Bitamps의 장점은 하나의 key에서 offset을 사용하여 값을 비트별로 나눠서 읽고 쓰기 때문에 적은 메모리와 빠른 비트 연산을 제공한다고 생각이 되는데요.올려주신 예시를 보면 key는 계속해서 바뀌고 있고, offset도 전혀 사용하지 않는 것 같습니다.해당 상황에서도 일반적인 Strings 대신에 Bitamps를 쓰신 특별한 이유가 있는지 궁금합니다.
-
해결됨실습으로 배우는 선착순 이벤트 시스템
쿠폰 테이블 조회 시 user_id 값
db에 등록도 잘 되었는지 확인해 보기 위해서coupon 테이블 조회 해보았는데 [coupon_id], [user_id]테스트 로직에서 userId 값은 단순히 for을 통해 0부터 순차적으로 받은 뒤쿠폰 개수에 맞춰 userId 도 0~99 사이의 값이 들어 올 것이라 생각했는데예상과 다르게 103 이라는 id가 들어왔습니다이런 이유가 궁금합니다
-
미해결15일간의 빅데이터 파일럿 프로젝트
tail -f flume-cmf-flume-AGENT-server02.hadoop.com.log 오류
tail -f flume-cmf-flume-AGENT-server02.hadoop.com.log 했을때 Creating이나 강의에 말씀한 내용 나오지않고, 아래처럼 나오기만 하는데 Flume Config파일도 정상적이고 재시동도 해봤는데 안되는데 또 조치해야할게 있을까요?
-
미해결15일간의 빅데이터 파일럿 프로젝트
FileZilla 권한 거부
강사님하신대로 빠른연결하면 home/bigdata가 아닌 /로 들어가지고 home을 눌러서 bigdata로 들어가려해도 권한 수정되어있는데 제가 뭔가 빠뜨린건가요?bigdata 권한 수정해주면 될 것 같긴한데 추후에 문제가 생길까봐 문의드립니다.
-
미해결15일간의 빅데이터 파일럿 프로젝트
5. Cloudera Manager 구성 시 오류
강의와 똑같이 설정하고 돌렸는데 위와 같은 오류들이 발생하는데 해결 방법을 모르곗습니다 ㅠㅜ
-
미해결15일간의 빅데이터 파일럿 프로젝트
클라우데라 접속 중 블루스크린 오류
안녕하세요. 아래 질문 글을 실수로 수정 대신 삭제를 눌러 다시 질문을 남깁니다.호스트 파일을 다음과 같이 구성하고 가상 머신을 작동시킨 후에 크롬을 통해 URL을 접속시도를 하면 블루스크린이 뜨며 컴퓨터가 다운됩니다. ㅠㅠ아래는 가상머신화면 과 호스트 파일을 첨부하여 올립니다.
-
미해결15일간의 빅데이터 파일럿 프로젝트
클라우데라 매니져 접속하기 오류
안녕하세요. 클라우데라 매니져 접속하기를 진행하는 도중 오류가 발생했습니다. server01.hadoop.com:7180 URL로 접속시 다음과 같이 접속이 되지 않고,IP 주소로 접속을 시도를 해보았는데, 블루스크린이 뜨며 컴퓨터가 종료됩니다.hosts 파일은 다음과 같이 수정하였습니다.
-
미해결실습으로 배우는 선착순 이벤트 시스템
consumer 셋팅 숫자 출력이 안됩니다.
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); } }로 작성했지만 터미널에서 강사님과 같이 숫자들이 찍히자 않습니다.그리고 터미널 안의 글씨 너무 작은것 같아요
-
미해결실습으로 배우는 선착순 이벤트 시스템
kafka 사용 이유
안녕하세요,궁금한 내용이 생겨 기존에 질문들을 살펴보고 제가 이해한 것이 맞는지 확인차 질문드립니다. redis의 싱글스레드 특성으로 100개 발급에 대한 race condition 해결 --> 그러나 insert 시 DB 처리량에 부하가 발생할 수 있음kafka 미들웨어를 통해 100개의 쿠폰 저장 이벤트를 보관해두었다가 컨슈머에서 원할때 꺼내어 처리할 수 있는 여지를 주어 처리량 부하를 분산시킬 수 있음ex) 쿠폰 발급은 당장 안해도 되니, kafka에 이벤트만 잘 발행되어 있다면 DB 작업량이 적은 새벽에 꺼내서 저장해도 됨 이렇게 이해했는데, 맞을까요?
-
해결됨실습으로 배우는 선착순 이벤트 시스템
kafka를 왜 사용하는지가 잘 이해가 안가서 질문 남깁니다!
안녕하세요! 강의 잘 듣고 있습니다. 감사합니다. https://www.inflearn.com/course/lecture?courseSlug=%EC%84%A0%EC%B0%A9%EC%88%9C-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EC%8B%A4%EC%8A%B5&unitId=156125&category=questionDetail&tab=community&q=1029856해당 질문과 답변을 보고 추가 질문 드리려고 합니다. 제가 kafka나 redis, 분산서버 등에 대해 이해도가 낮은 점 양해 부탁드립니다! 1.Kafka 미사용시 주문생성/회원가입요청의 타임아웃 및 10분뒤 실행에 대한 해결책으로 Kafka 를 선택한 이유는 배압조절(back pressure) 때문입니다.이렇게 말씀을 해주셨는데요,답변에서 말씀하신 예시에서 처럼 10000개 요청이 있고,카프카를 사용한다면,요청 100개가 쌓일때마다 db에 insert를 하고, 다시 요청 100개가 쌓일때까지 기다렸다가 insert 하기를 반복한다는 것으로 이해하면 될까요?2. 그게 맞다면, 강의에서 구현한 apply 메서드에서 100개의 요청이 왔는지 확인하지 않고, kafka를 사용해서 다른곳에 전달하여 처리하는 이유는 무엇인가요?예시로 apply 메서드 안에서 redis의 incr 값을 체크하면 요청이 몇개가 쌓였는지 알 수 있을테고, 데이터를 임시저장하다가 100개마다 처리할 수 있을거란 생각이 들었습니다. kafka로 다른 모듈로 전달하는 것과의 차이점이 무엇인가 궁금합니다.3.실제로 consumer에서 100개의 작업이 완료되었는지는 일반적으로 어떻게 확인하는 걸까요? db에 저장하기 전에 100개의 데이터는 어디에 임시저장을 하나요?
-
미해결실습으로 배우는 선착순 이벤트 시스템
카프카 토픽 생성이 안되요.
docker exec -it kafka kafka-topics.sh --bootstrap-server localhost:9092 --create --topic testTopic위와 같이 터미널에 토픽생성하는 명령어를 작성하면 아무것도 |움직이지 않고 터미널이 멈춥니다.도커는 정상적으로 실행하고 kafka,zookeeper도 정상적으로 실행되어있습니다.도커를 삭제하고 다시 다운로드해서 docker compose사용해서 kafka,zookeeper이미지 다시 작동시켜도 위와같이 토픽생성 명령어 입력하고 작동시 아무것도 안하고 멈춥니다..(p.s 카프카 컨테이너 cli들어가서도 토픽 생성 명령어 작동시켜도 작동안합니다.)혹시 해당 문제 해결법 아실까요..?
-
해결됨Backend 멀티쓰레드 이해하고 통찰력 키우기
코틀린으로 해당 C# 예제를 비슷하게 만들어봤는데, 제가 잘못 작성한 걸까요?
<상황>지식 공유자님께서 작성해주신 C# 코드 예제를 코틀린으로 비슷하게 작성해서 시도해보았지만 같은 상황이 재현되지 않습니다. <질문 의도>제가 지식 공유자님의 코드를 잘못 이해하고 작성한 것인지, 아니면 JVM의 의도치 않은 최적화 때문에 의도와 다르게 동작하는 것인지 궁금합니다. <작성한 코드>fun main (args: Array<String>) { Example().startUp() } class Example() { private var shouldStop = false fun startUp() { println("process start") val thread = Thread(Runnable { doWork() }) thread.start() Thread.sleep(1000) shouldStop = true thread.join() println("process end") } // shouldStop에 @Volatile을 붙이지 않으면 무한 루프를 돌 것이라고 생각했으나 // graceful shutdown이 잘 되어버림 private fun doWork() { while (!shouldStop) { println("doWork..") Thread.sleep(1000) } } } 좋은 강의 만들어주셔서 감사합니다!
-
미해결
스프링 테스트에서 embedded redis 사용할 때 뜨는 로그..
[lettuce-nioEventLoop-6-1] INFO io.lettuce.core.protocol.CommandHandler - null Unexpected exception during request: java.net.SocketException: Connection reset java.net.SocketException: Connection reset at java.base/sun.nio.ch.SocketChannelImpl.throwConnectionReset(SocketChannelImpl.java:394) SocketChannelImpl.java:394 at java.base/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:426) SocketChannelImpl.java:426 at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:254) PooledByteBuf.java:254 at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1132) AbstractByteBuf.java:1132 at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:357) NioSocketChannel.java:357 at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:151) AbstractNioByteChannel.java:151 at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788) NioEventLoop.java:788 at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724) NioEventLoop.java:724 at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650) NioEventLoop.java:650 at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562) NioEventLoop.java:562 at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) SingleThreadEventExecutor.java:997 at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ThreadExecutorMap.java:74 at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) FastThreadLocalRunnable.java:30 at java.base/java.lang.Thread.run(Thread.java:840) 스프링 테스트에서 embedded redis를 사용해 테스트하던 중에 이런 로그가 뜨네요...에러는 아닌 것 같은데 정확히 뭘 하라는 건지 모르겠어요 ㅠㅠ저 문구를 어떻게 하면 없앨 수 있을까요?....
-
미해결실전! Redis 활용
subscriber, publisher 두개 같은 포트로 띄울 수 있나요?
이미 레디스 cli가 띄워져 있다고 해서요..
-
미해결실습으로 배우는 선착순 이벤트 시스템
쿠폰 발급을 api로 제공할 경우, client에서 쿠폰 발급 여부를 확인할 수 있는 방법 문의드립니다.
안녕하세요. 강의 잘 들었습니다.강의 들으면서 궁금증이 생겼는데, 만약에 쿠폰 발급 기능을 API로 제공한다고 가정하면client -> 쿠폰 발급 기능 API 호출이 이루어지고쿠폰 발급 기능 API에서는 쿠폰 발급 여부를 확인하고 kafka로 produce하게 되는데, 이때는 실제로 쿠폰이 발급된 상태는 아닐 수도 있을 것으로 예상됩니다(실제 쿠폰이 발급되는 시점은 consumer에서 작업이 정상적으로 완료되어야하므로 트래픽이 많거나 하는 경우 시간차이가 더 심할 것으로 예상됩니다) 이러면 쿠폰 발급 기능 API에서 응답값은 어떤 값을 줘야할까요?쿠폰 발급 여부에서 발급이 가능하다면 쿠폰 발급되는것은 확정이기 때문에 발급되었다는 정보?쿠폰 발급 여부에서 발급이 가능하지만 추가적으로 polling해서 client 쪽에서 확인하도록 처리?제가 생각했을땐 위의 2가지정도로 가능할 것 같은데 강사님 의견이 궁금합니다..! 감사합니다.
-
미해결실습으로 배우는 선착순 이벤트 시스템
예제 프로젝트 상에서의 Kafka 사용시 궁금한점
강의 잘 듣고 있습니다. 질문사항이 두개 있습니다.1.4강의 [문제점] 영상에서 쿠폰생성 10000개 요청으로 인해 mysql이 1분에 100개의 insert가 가능하다고 가정할 시 '주문생성/회원가입요청이 타임아웃 또는 10분뒤에 실행' 된다고 하셨는데요.예제로 사용하신 Kafka 사용 예제에서는 Consumer 프로젝트도 어차피 API프로젝트와 같은 DB를 바라보고 있으므로, 어차피 Kafka를 사용하여도 '주문생성/회원가입요청이 타임아웃 또는 10분뒤에 실행'되지 않나요? 왜 여쭤보냐면, 강의 내에서 Kafka 미사용시 주문생성/회원가입요청의 타임아웃 및 10분뒤 실행에 대한 해결책을 Kafka로 사용하셔서 문의드립니다.2.5강의 [Consumer 사용하기] 영상을 보면 API 프로젝트 Consumer 프로젝트가 별개로 존재합니다.그러므로 API프로젝트의 테스트 케이스가 종료되어도 Consumer 프로젝트는 이미 Kafka로 100개의 데이터가 스트림으로 들어오는 상태이므로, 테스트케이스가 종료되어도(즉, API프로젝트가 종료되어도) Cunsumer 프로젝트는 종료가 되지 않은 상태이므로 100개의 쿠폰이 DB에 생성이 되어야 하는게 아닌지요?왜 여쭤보냐면, 강의 내에서는 API프로젝트가 종료되면 Consumer 프로젝트도 작업이 멈추는 현상이 있어서 문의드립니다.
-
미해결실습으로 배우는 선착순 이벤트 시스템
쿠폰 카운트를 Redis에 의존하고 있는데요
만약 Redis에 장애가 발생한다면 2차 장치로 DB Count에 의존할 수 밖에 없는걸까요?실무에선 어떻게 대응하시는지 궁금합니다!
-
미해결실습으로 배우는 선착순 이벤트 시스템
동시성제어
안녕하세요 강의를 듣다가 궁금증이 생겼는데요. kafka는 메시지를 하나씩 처리하기 때문에 동시성 제어도 가능할 것이라고 이해했는데 그렇다면 여기서 레디스를 사용하지 않더라도 카프카만 사용해도 동시성과 관련된 데이터 정합성을 보장할 수 있는건가요?