안녕하세요! 강의 잘 듣고있습니다. 질문이 두 개 있는데요, 1/ RentalCard라는 도서 대여 카드로 Entity를 구성하셨는데, 이벤트 스토밍때 한 번도 Card라는 개념이 나오지 않은 것 같습니다. DDD 자체가 유비쿼터스 언어로 기술되어야하는 것으로 이해했는데, Card라는 키워드가 이벤트 스토밍때 도출되지 않는걸로 봐서는 비즈니스 언어라고 하기 어려울 것 같습니다. 이 상황에서 RentalCard라는 네이밍을 지으신 이유가 있을까요? 2/ RentalCard 도메인 자체에 ReturnItem을 쥐고있어, 이 설계에서는 Aggregate가 매번 ReturnItem 리스트를 조회하게 됩니다. 사용자 대여 목록이 쌓이게 되면 이 리스트가 매우 커질수도 있을 것 같은데, 이러한 문제는 현업에서 어떻게 처리하나요?
rpm -Uvh https://rpmfind.net/linux/centos/7.9.2009/extras/x86_64/Packages/centos-release-scl-rh-2-3.el7.centos.noarch.rpm 해당 명령어 시 아래처럼 파일 다운로드 불가 나옵니다. error: skipping https://rpmfind.net/linux/centos/7.9.2009/extras/x86_64/Packages/centos-release-scl-rh-2-3.el7.centos.noarch.rpm - transfer failed
안녕하세요. 강사님, 강의 잘 보고 있습니다. 강의를 보면서 궁금증이 생겨서 질문 남겨봅니다! 강의를 진행하시는 방식이 제공해 주신 스켈레톤 코드 베이스로 설명을 하시다가 구현되어 있는 것을 가져다가 붙여넣기 하시는 방식 같은데요! 이럴 때 수강생들의 입장에서는 강사님의 구현을 손으로 구현해 보는 게 좋을까요? 아니면 AI로 구현을 진행해서 강사님의 구현과 비교해 보는 게 좋을까요? 수강생들이 어떻게 강의를 들었으면 좋겠다는 생각을 하시는지 궁금합니다.
강사님, MSA의 장애 격리에 대해 강의를 듣다가 궁금한 점이 생겨 질문드립니다. 제가 이해하기로는 모놀리식은 하나의 애플리케이션 안에 여러 도메인/서비스가 함께 구성되어 있고, MSA는 각 도메인별로 서비스를 분리하여 구성하는 것으로 알고 있습니다. 강의에서 MSA의 장점 중 하나로 장애 격리를 말씀해 주셨는데, 실제로는 한 서비스의 장애가 해당 서비스를 의존하고 있는 다른 서비스로 전파될 수도 있지 않을까 하는 생각이 들었습니다. 예를 들어 여러 서비스에서 회원 정보나 회원 상태를 검증하기 위해 회원 서비스에 요청을 보내야 하고, 회원 서비스의 검증 결과가 정상이어야만 해당 서비스를 이용할 수 있는 구조라고 가정하겠습니다. 이 경우 회원 서비스에 장애가 발생하면 회원 서비스에 의존하고 있는 여러 서비스에서도 요청 처리가 불가능해지기 때문에, 결국 장애가 다른 서비스로 전파되는 것처럼 보입니다. 그래서 제가 생각한 것은 MSA의 장애 격리가 '장애가 다른 서비스로 전혀 전파되지 않는다'는 의미보다는, 모놀리식에 비해 장애가 발생했을 때 영향을 받는 범위를 제한할 수 있다는 의미에 더 가깝지 않을까? 하는 것입니다. 예를 들어 모놀리식에서는 하나의 애플리케이션에 장애가 발생하면 전체 기능에 영향을 줄 수 있지만, MSA에서는 특정 서비스의 장애가 해당 서비스 및 이를 직접적으로 의존하는 서비스 정도로 영향 범위를 제한할 수 있다는 의미인지 궁금합니다. 그리고 실제 MSA 환경에서는 이러한 장애 전파를 막기 위해 Circuit Breaker, Timeout, Retry, Fallback, 비동기 메시징 등의 방법을 사용해서 장애 격리 수준을 높이는 것으로 이해하고 있는데, 제가 이해한 방향이 맞는지도 궁금합니다. 결국 MSA에서 말하는 장애 격리의 핵심이 '완전한 장애 격리'라기보다는 '장애 영향 범위를 줄이고 장애 전파를 제어할 수 있다'는 점에 있다고 이해하면 될까요?
강의 내용에 보면 클라이언트 수만큼 pub/sub 연결을 하면 안된다. redis 구독을 소수의 연결로 유지하고 클라이언트들에게 브로드캐스트 하는 구조로 사용한다. 애플리케션 시작 시 생성하고 서버 종료될 때 구독을 해제한다. 이렇게 설명을 주시는데 이해가 잘 되지 않아 질문을 드립니다. 1번 2번에 대해 대부분 채팅과 관련하여 메시지가 소실되도 무방한 구조에서 pub/sub의 브로드캐스팅 방법을 사용하는 것으로 알고 있습니다. 이전에 언급하신 Redis Lock에서 사용하는 경우는 애초 접근하는 서버가 수십~ 수백대일 가능성이 있습니다. 채팅의 경우도 유투브 라이브의 경우 수천 수만명의 접속일 가능성이 있습니다. 서버의 가용 능력에 따라 분산 설계가 있을 수 있겠지만 기본적으로 이러한 요구에서는 1:N이 됩니다. 어떤 목적과 이유로 1번과 관련하여 말씀을 하신건지 알고 싶습니다. 하나의 pub/sub 연결을 여러 채널이 공유해서 사용하는 것이기에 pool에 대한 이야기는 아닐 것이라 생각 합니다. 혹시 예제는 스웨거에서 요청할 때마다 pub/sub을 생성해서 사용하는 것이기에 애초에 하나의 pub/sub 연결로 사용하는 방안으로 코드를 설계해야 한다는 의미일까요? 하지만 그럼에도 클라이언트 수나 구독을 소수로 유지해야 하는 의미는 pool을 의미하시는 건지 서버 자원 때문인지 어떤 이유에서인지에 대한 이해가 잘 되지 않습니다. 3. 3번에서 하는 말이 하나의 pub/sub 연결을 시작시 생성하여 모든 채널에 대해 공유 사용하고 종료시 구독을 해제하도록 하라는 의미로 보면 될런지요
시스템 디자인 첫걸음 with LLM: 운영 가능한 AI 서비스(RAG·AI Agent) 아키텍처 설계하기
안녕하세요, 좋은 강의 잘 듣고 있습니다. LLM 서비스의 핵심 목표 중 신뢰성 의 핵심 키워드로 정확성, 일관성, 안정성 세 가지를 말씀해 주셨는데요, 이 중 정확성과 일관성이 각각 어떤 의미인지 좀 더 자세히 여쭤보고 싶습니다. 특히 앞에서 설명해 주신 것처럼 LLM은 확률에 기반을 두기 때문에 응답이 매번 바뀔 수밖에 없는데, 이런 전제 위에서 궁금한 점이 두 가지 있습니다. 일관성을 실제로 어떻게 구현할 수 있는지 궁금합니다. 실무에서 주로 쓰이는 방법이 있을까요? 일관성을 판단할 수 있는 지표나 기준, 기법이 있는지 궁금합니다. 신뢰성 지표로 Hallucination Rate, Faithfulness, Context Precision/Recall을 소개해 주셨는데, 이들은 주로 정확성 쪽에 가까워 보여서 일관성은 어떤 방식으로 측정하는지 궁금합니다. 감사합니다.
안녕하세요. 인기 게시판 목록 기능을 Redis의 Sorted Set을 활용해 좋아요 순으로 정렬하는 방식으로 구현하다 고민이 생겨 질문하게 되었습니다. 먼저 잦은 데이터 변경을 고려해서 Sorted Set의 member에는 게시판 ID만 저장하고, score에는 좋아요 수를 저장하도록 했습니다. 하지만 목록을 생성하기 위해서는 제목, 생성일 같은 부가 정보가 필요한데 이 데이터를 얻는 효율적인 방식에 대해 고민이 생겨 질문을 드리게 되었습니다. AI에게 도움을 받아 2가지 방법을 생각해보았는데 현실성이 있는지 판단 부탁 드립니다. Redis + RDB 조합 Redis ZSet에서 상위 10개의 ID 목록을 먼저 조회합니다. 해당 ID 목록을 가지고 RDB에 WHERE id IN (...) 쿼리를 날려 상세 데이터를 가져옵니다. 데이터베이스의 IN 쿼리는 순서를 보장하지 않기 때문에 애플리케이션에서 Redis가 준 ID 순서대로 리스트를 다시 재정렬하여 반환합니다. 제가 생각하기에는 인기 게시판 목록을 조회할 때마다 RDB의 ORDER BY 부하를 줄이려다 오히려 애플리케이션 단에서 정렬과 DB 조회가 일어나다 보니 얻는 것보다는 잃는 게 많은 구조가 아닌지 고민이 됩니다. Redis Sorted Set + Hash 조합 정렬 기준(ID, 좋아요 수)은 기존대로 Sorted Set에 관리합니다. 게시판의 상세 부가 정보는 Redis의 Hash 자료구조에 따로 캐싱합니다. 목록 조회 시 Sorted Set에서 ID를 뽑은 후 DB를 거치지 않고 Hash에서 상세 데이터를 조회합니다. 이 방식은 DB에 부하를 줄일 수 있지만 데이터가 자주 변하게 된다면 레디스에서 데이터를 자주 변경해야 되어 메모리에 큰 부하를 줄 수 있을 것 같아 고민이 되는 것 같습니다.
안녕하세요 강사님 강의 잘 듣고 있습니다. 섹션 9에서 강의대로 docker에 rabbitmq를 올린 뒤 configservice를 실행했는데 오류가 발생합니다. org.springframework.amqp.rabbit.listener.BlockingQueueConsumer$DeclarationException: Failed to declare queue(s):[springCloudBus.anonymous.PswTKgDeT12hTiCFa33hLw] at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.attemptPassiveDeclarations(BlockingQueueConsumer.java:772) ~[spring-rabbit-3.2.5.jar:3.2.5] at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.passiveDeclarations(BlockingQueueConsumer.java:649) ~[spring-rabbit-3.2.5.jar:3.2.5] at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:636) ~[spring-rabbit-3.2.5.jar:3.2.5] at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.initialize(SimpleMessageListenerContainer.java:1482) ~[spring-rabbit-3.2.5.jar:3.2.5] at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$ AsyncMessageProcessingConsumer.run (SimpleMessageListenerContainer.java:1322) ~[spring-rabbit-3.2.5.jar:3.2.5] at java.base/ java.lang.Thread.run (Thread.java:1447) ~[na:na] Caused by: java.io .IOException: null at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:140) ~[amqp-client-5.25.0.jar:5.25.0] at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:136) ~[amqp-client-5.25.0.jar:5.25.0] at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:158) ~[amqp-client-5.25.0.jar:5.25.0] at com.rabbitmq.client.impl.ChannelN.queueDeclarePassive(ChannelN.java:1033) ~[amqp-client-5.25.0.jar:5.25.0] at com.rabbitmq.client.impl.ChannelN.queueDeclarePassive(ChannelN.java:47) ~[amqp-client-5.25.0.jar:5.25.0] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:565) ~[na:na] at org.springframework.amqp.rabbit.connection.CachingConnectionFactory$CachedChannelInvocationHandler.invoke(CachingConnectionFactory.java:1201) ~[spring-rabbit-3.2.5.jar:3.2.5] at jdk.proxy2/jdk.proxy2.$Proxy140.queueDeclarePassive(Unknown Source) ~[na:na] at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.attemptPassiveDeclarations(BlockingQueueConsumer.java:750) ~[spring-rabbit-3.2.5.jar:3.2.5] ... 5 common frames omitted Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no queue 'springCloudBus.anonymous.PswTKgDeT12hTiCFa33hLw' in vhost '/', class-id=50, method-id=10) at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66) ~[amqp-client-5.25.0.jar:5.25.0] at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:36) ~[amqp-client-5.25.0.jar:5.25.0] at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:552) ~[amqp-client-5.25.0.jar:5.25.0] at com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.java:316) ~[amqp-client-5.25.0.jar:5.25.0] at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:152) ~[amqp-client-5.25.0.jar:5.25.0] ... 12 common frames omitted Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no queue 'springCloudBus.anonymous.PswTKgDeT12hTiCFa33hLw' in vhost '/', class-id=50, method-id=10) at com.rabbitmq.client.impl.ChannelN.asyncShutdown(ChannelN.java:528) ~[amqp-client-5.25.0.jar:5.25.0] at com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:349) ~[amqp-client-5.25.0.jar:5.25.0] at com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:193) ~[amqp-client-5.25.0.jar:5.25.0] at com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:125) ~[amqp-client-5.25.0.jar:5.25.0] at com.rabbitmq.client.impl.AMQConnection.readFrame(AMQConnection.java:761) ~[amqp-client-5.25.0.jar:5.25.0] at com.rabbitmq.client.impl.AMQConnection.access$400(AMQConnection.java:48) ~[amqp-client-5.25.0.jar:5.25.0] at com.rabbitmq.client.impl.AMQConnection$ MainLoop.run (AMQConnection.java:688) ~[amqp-client-5.25.0.jar:5.25.0] ... 1 common frames omitted 깃허브의 프로젝트를 그대로 가져오고 어떻게 해도 해결이 안되네요ㅠㅠ 도움 부탁드립니다..
좋은 강의 감사합니다. 덕분에 전반적인 개념 잡는 것에 큰 도움 되고 있습니다. 33. AWS EC2 인스턴스 생성 12분 부분 쯤에 보면, 아웃바운드 규칙에서 이미 모든 트래픽의 모든 아이피가 허용상태인데 SSH와 HTTP를 내 아이피만 허용하는 것이 맞는건가요? 인바운드에서만 추가하는 것이 맞지 않나요?