쿠폰 100개를 발급해야하고 이 개수는 100을 넘어가면 안됨 -> java synchronized락의 경우 쿠폰 발급을 담당하는 서버가 여러개라면 db에 쿠폰 저장(개수 업데이트) 요청이 동시에 올수 있으므로 race condition 발생 -> redis의 경우 여러 서버가 쿠폰 발급 요청을 보내도 싱글 스레드이므로 쿠폰 발급 수를 정확히 100개로 맞출 수 있음. 하지만 예제의 경우 threadpool을 사용하여 각 스레드별로 쿠폰 발급이 가능하면 바로 db에 쿠폰 저장하는 로직이라서 db 부하가 심함 -> kafka를 도입하여 스레드들이 쿠폰 발급 메세지만 카프카로 보내고 카프카 컨슈머가 이 메세지를 처리하여 db에 쿠폰을 저장함. 컨슈머 그룹에 속한 컨슈머는 현재 하나이므로 메세지 1개씩을 처리함 따라서 db에 부하가 심하지 않음.
안녕하세요. 강의 너무 잘 듣고 제 프로젝트에 필요한 부분들로 리팩토링 하면서 MSA를 처음 공부하려 했습니다! 먼저 제 프로젝트는 거의 똑같은 구조로 게시글이 있습니다. 2가지의 질문이 있습니다. (1) 정보를 취합하기 위해 동기로 API호출을 한다는 것은 장애 전파가 된다고 이해하고 있습니다. 그렇다면 저희 예시에서도 Article-read에서 조회수는 api호출을 통해 받기로 했습니다. 그렇다면 어느정도의 장애 전파는 허용한다고 받아들여집니다. 실제 서비스에서도 여러 정보를 취합해서 줘야하는 경우가 많을텐데 API를 통해 정보를 가져오는것이 절대 안되나요? 아니면 종종 허용하기도 하나요? (2) CQRS의 Query(질의)부분은 데이터 수정이 없어야 한다 이해했습니다. 그런데 데이터를 수정해도 되나요? 예를 들어 제가 게시글 상세 조회를 게시글 모듈에서 분리하려고 합니다. 그런데 게시글 상세 조회를 하게되면 조회수가 올라갑니다. 따라서 게시글 상세조회 발생 -> 조회수 증가 이벤트 발생 ->조회수 증가 이런 식으로 구상을 했습니다. 이러한 질의 부분 모듈에서 데이터를 수정하게 만드는 이벤트가 발생해도 괜찮을지 여쭤봅니다!!
안녕하세요. 먼저 좋은 강의 감사드립니다. 데이터 버저닝에서 이해가 가지 않는 부분이 있어서 질문 드립니다. 낙관적 락을 사용하는걸 봤습니다. 결과적으로 발행시와 소비시의 버전이 같아야 하는데, 대규모 시스템에서 장애가 발생하지 않으려면 프로듀서에 아이디 1인 상품 발행하고 나서 컨슈머에서 처리하기 전까지 절대 새로운 이벤트를 발행하면 안되는거 아닌가요? 만약 컨슈머에서 처리하기 전에 이벤트를 발행하면 똑같은 버전이 후에 계속 들어와서 이 재고 업데이트는 무시되는게 아닌가 해서 질문드립니다. 맞다면 재고 감소 멱등성은 어떻게 해결하면 좋을지 고견 듣고 싶습니다. 감사합니다.
안녕하세요 강사님. 좋은 강의 감사드립니다. 항상 강의 잘듣고 있습니다 😀 다름이 아니라, 복합키 디코딩 관련 질문이 있습니다. 아래와 같이 Group By와 Window Session 함수를 결합한 CTAS절입니다. CREATE OR REPLACE TABLE MASTER WITH ( KAFKA_TOPIC = 'master', KEY_FORMAT = 'JSON', VALUE_FORMAT = 'JSON' ) AS SELECT TRID AS KEY, AS_VALUE(TRID) AS "trid", WINDOWSTART AS "min_time", WINDOWEND AS "max_time", (WINDOWEND - WINDOWSTART) AS "duration", MIN timestamp ) AS "@timestamp", COLLECT_LIST(service) AS services, COLLECT_SET(system) AS systems FROM ORIGINAL_STREAM WINDOW SESSION (5 SECONDS) GROUP BY TRID EMIT CHANGES; 제가 기대한 값으로는 master라는 토픽의 key에 trid와 windowstart 값으로 결합된 JSON 형식의 값이 저장되는 것이었습니다. ksqldb에서 print 문으로 topic을 조회하면 잘 읽히지만, kafka-consumer에서 topic을 조회하면, 디코딩 부분에서 깨져서 조회가 됩니다. 명령어: ./kafka/bin/ kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic cpm_master --from-beginning --property print.key=true 현재는 총 두 개의 쿼리를 추가적으로 사용하여 id 값을 컨슈머가 읽을 수 있도록 정제하고 있습니다. 혹시 이 문제에 대해서 아신다면 답변 주시면 감사하겠습니다!
echo $CONFLUENT_HOME이 정확한 위치인것 확인했고, zookeeper.properties와 zookeeper-server-start가 정확한 위치인 것도 확인했습니다. 그러나 zookeeper-server-start $CONFLUENT_HOME/etc/kafka/zookeeper.properties를 치면 아무것도 나오지 않습니다. 에러 문구조차도 없네요
안녕하세요. Cooperative Sticky Rebalancing할 때 컨슈머 3만 reassign rebalance된다고 하셨습니다. 궁금한건 컨슈머 1 2에서 topic A, B / Partion 1 2 각각 총 4개는 유지된다고 하셨는데 이떄 poll은 계속 동작하고 있는건지 궁금합니다. 즉, 3이 죽고 이걸 새로 붙이는 컨슈머 1 2에 있는 모든 토픽과 모든 파티션에 poll이 정지되나요? 아니면 같은 토픽 컨슈머만 정지되나요? (여기선 A P1이 있어고 A에 P3가 붙으므로 P1이 P3를 위한 assign rebalance 때문에 컨슈머 1 A 토픽 poll 전체 정지) reassign rebalance: 부분 할당 rebalance: 전체 할당 으로 이해하면 되는지도 궁금합니다. 감사합니다.
안녕하세요. Consumer Fetcher관련 주요 파라미터와 Fetcher 메커니즘의 이해 강의 5:03에서 망냑 파티셩니 10개 있으면 최대 10MB 가져올 수 있따 이렇게 말씀하셨는데 컨슈머를 띄울 때 파티션별로 각 서버마다 따로 뜨게 하시는지 한 컨슈머 서버에 여러 파티션을 구독하게 띄우시는지 궁금합니다. 이를 설정하는 기준이 있으신지도 궁금합니다. 제가 카프카를 처음 공부하고 있어서 혹시 질문이 잘못되었다면 알려주시면 감사하겠습니다. 감사합니다.
안녕하세요. consumer.poll 관련해서 궁금한 점이 생겨 질문드립니다. 일단 가정으로 데이터 있으면 기다리지 않고 값을 반환한다고 하셨는데, 이 부분이 이해가 가지 않습니다. 처음에 직관적으로 poll이 데이터를 가져오는 주기라고 생각했습니다. 하지만 설명을 듣고 시간을 지정하는게 의미가 있나? 하는 생각이 들었습니다. 그 후 존재 이유를 poll 시간 이유 -> heart beat를 위한 것인가?로 생각했지만 heart beat 는 다른 스레드에서 동작하기 때문에 이도 아니라고 생각했습니다. 제 생각으로는 추론할 수 없어서 poll에 시간을 지정하는 이유가 무엇인지 설명해주시면 감사하겠습니다. 그리고, 추가 질문 2개가 더 있습니다. 추가 질문 1. 카프카는 왜 지연해서 poll하는 기능을 지원하지 않는지 궁금합니다. 카프카 철학 때문인건지 아니면 기술적 제한떄문인건지 궁금합니다. 추가 질문 2. heart beat thread는 만약 여러 토픽과 토픽 내에서도 여러 그룹 아이디로 구독하고 있다 했을 때 어떻게 동작을 하는지 궁금합니다. A, B 토픽 존재하고 A 토픽에 1 2 3 그룹 아이디 / B 토픽 ㄱ 그룹 아이디 존재한다 했을 때 heart beat thread가 3 + 1인 4개 생성되는게 맞는지 궁금합니다. 항상 좋은 강의 감사합니다.
안녕하세요 질문있습니다. 만약 게시글 전체 조회할 때 게시글 마다 좋아요 수도 함께 기재하려고 하면 게시글 조회 할 때 마다 articleId에 맞는 좋아요 수 정보도 함께 필요하잖아요? 현재 게시글 서버와 좋아요 서버가 다른 환경을 고려할 때 그러면 게시글 조회할 때 마다 좋아요 서버로의 api요청이 불가피할 거 같은데 이 경우 조회 성능이 당연히 안좋게 나올 수 밖에 없다고 생각합니다. 비정규화로 좋아요수를 게시글 테이블에 붙여서 단일 서버로의 요청을 만들어줄려고 해도 말씀하신 한계 때문에 안될 거 같구요. 만약 게시글 전체 조회 시에 게시글과 게시글의 좋아요수가 반드시 제공되어야 한다면 제가 생각한 성능 저하 포인트가 타당한가요? 만약 타당하다면 어떻게 개선할 수 있을까요? 인기게시글만 따로 추려서 레디스로 메모리를 활용해야할까요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강의 영상 잘 보고 있습니다! 영상 보다가 궁금한 점이 있어서 질문을 남기게 됐습니다. JVM에서 정상 종료의 경우는 항상 모든 Shutdown Hook의 실행이 보장되지 않나요? 메인 쓰레드에 대한 join() 호출 없어도 정상 종료의 흐름에서는 wakeup과 JVM 내부에서는 finally 블럭의 consumer.close()의 호출이 보장되지 않나요? 명시적으로 join()을 호출하지 않았을 때 발생할 수 있는 문제 상황이 궁금합니다!
안녕하세요, Debezium CDC Source Connector가 이벤트를 만들때 before, after 값 설명하시는 부분에서 이해가 안가는 부분이 있어서 질문드립니다. before값이 필요한 이유가 나중에 rollback할때 다시 after를 before로 가지고 갈 수 있어서라고 설명을 주셨는데, 이것은 RedoLog에 한정된 얘기인가요 아니면 CDC Source Connector에서도 실제로 이 값을 이벤트로 들어온다는 뜻인가요? 커밋이 확정된 변경 내용만 CDC 캡쳐를 하는 것으로 알고있어서 Redolog에 한정된 설명이라고 이해했는데 그렇다면 before값이 필요하다고 설명주신 이유가 정확히 어떤 뜻인지 궁금합니다. 혹시 아니면 CDC Event Source Connector에도 롤백처리된 트랜잭션의 변경이전데이터가 after값에 저장되어 온다는 의미인가요?
MSA기반 주문 서비스 에서 동기식으로 호출할때 재고 차감 - 쿠폰 사용 - 주문 완료 이런식으로 구성되어 있을때 쿠폰 사용 실패일때는 바로 사용자에게 응답이 가능하다고 생각을 하고 있습니다. 하지만 EDA기반으로 재고 차감 - 쿠폰 사용 - 주문 완료를 구현하면 주문이 완료되고 쿠폰사용에 실패가 되어 사용자는 주문이 완료되었지만 다시 실패메시지가 가고 그때서야 이유를 알수 있다고 생각을 하고 있습니다. 그래서 사용자 경험 상 동기식이 맞다고 판단되는데 제가 잘못 생각을 하고 있는걸까요? MSA 기반 EDA 주문 구조에서 재고가 부족하여 실패한다면 사용자에게 바로 응답을 해줄수 있을까욤?.