안녕하세요 강의를 수강하던 도중 Eureka에 연결해 놓은 프로젝트를 종료하면 모든 프로젝트에서 아래와 같은 에러가 발생합니다 해결방안이 있을까요? 2024-05-28T23:22:04.304+09:00 INFO 42143 --- [apigateway-service] [ionShutdownHook] o.s.c.n.e.s.EurekaServiceRegistry : Unregistering application APIGATEWAY-SERVICE with eureka with status DOWN 2024-05-28T23:22:04.304+09:00 INFO 42143 --- [apigateway-service] [ionShutdownHook] com.netflix.discovery.DiscoveryClient : Saw local status change event StatusChangeEvent [timestamp=1716906124304, current=DOWN, previous=UP] 2024-05-28T23:22:04.304+09:00 DEBUG 42143 --- [apigateway-service] [nfoReplicator-0] c.n.discovery.InstanceInfoReplicator : Executing on-demand update of local InstanceInfo 2024-05-28T23:22:04.304+09:00 DEBUG 42143 --- [apigateway-service] [nfoReplicator-0] c.n.discovery.InstanceInfoReplicator : Canceling the latest scheduled update, it will be rescheduled at the end of on demand update 2024-05-28T23:22:04.304+09:00 INFO 42143 --- [apigateway-service] [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_APIGATEWAY-SERVICE/192.168.75.30:apigateway-service:8000: registering service... 2024-05-28T23:22:04.309+09:00 INFO 42143 --- [apigateway-service] [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_APIGATEWAY-SERVICE/192.168.75.30:apigateway-service:8000 - registration status: 204 2024-05-28T23:22:06.396+09:00 INFO 42143 --- [apigateway-service] [ionShutdownHook] com.netflix.discovery.DiscoveryClient : Shutting down DiscoveryClient ... 2024-05-28T23:22:09.402+09:00 INFO 42143 --- [apigateway-service] [ionShutdownHook] com.netflix.discovery.DiscoveryClient : Unregistering ... 2024-05-28T23:22:09.410+09:00 INFO 42143 --- [apigateway-service] [ionShutdownHook] c.n.d.s.t.d.RedirectingEurekaHttpClient : Request execution error. endpoint=DefaultEndpoint{ serviceUrl='http://localhost:8761/eureka/} exception=Connection pool shut down stacktrace=java.lang.IllegalStateException: Connection pool shut down 중략... 2024-05-28T23:22:09.413+09:00 INFO 42143 --- [apigateway-service] [ionShutdownHook] c.n.d.s.t.d.RedirectingEurekaHttpClient : Request execution error. endpoint=DefaultEndpoint{ serviceUrl='http://localhost:8761/eureka/}, exception=Connection pool shut down stacktrace=java.lang.IllegalStateException: Connection pool shut down 중략... 2024-05-28T23:22:09.413+09:00 WARN 42143 --- [apigateway-service] [ionShutdownHook] c.n.d.s.t.d.RetryableEurekaHttpClient : Request execution failed with message: Connection pool shut down 2024-05-28T23:22:09.413+09:00 ERROR 42143 --- [apigateway-service] [ionShutdownHook] com.netflix.discovery.DiscoveryClient : DiscoveryClient_APIGATEWAY-SERVICE/192.168.75.30:apigateway-service:8000 - de-registration failedCannot execute request on any known server com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server 중략... 2024-05-28T23:22:09.420+09:00 INFO 42143 --- [apigateway-service] [ionShutdownHook] com.netflix.discovery.DiscoveryClient : Completed shut down of DiscoveryClient Process finished with exit code 130 (interrupted by signal 2:SIGINT)
안녕하세요. 회사에 카프카 도입을 위해 강의를 수강중에 궁금한 사항이 있어 질문드립니다. 파티션을 여러개 만들어 사용하게 되면 같은 파티션 내에서는 순서를 보장할 수 있지만 멀티 파티션의 경우 파티션간의 순서는 보장하지 못하는걸로 아는대요 병렬처리가 되어야 처리량이 어느정도 확보가 될 것 같아 멀티파티션을 고려해야할 것 같은대 이러한 경우 멀티파티션에서도 순서를 보장할 수 있는 방법이 있을까요? 검색을 좀 해보니 스트림즈 사용시에 멀티파티션이어도 순서를 보장할 수 있다고 하는거 같기도한대 어떻게 하면 되는지 궁금합니다.
안녕하세요 강사님 스트림즈DSL과 프로세서API 를 설명하는 부분에서 스트림즈 DSL이 일부기능을 지원하지 않는다고 하셨는데요 이중에서 스트림즈DSL에서는 인터벌마다 데이터를 처리하는 부분을 지원하지 않는다고 하셨는데요. 강의 후반에 나오는 window 프로세싱을 이용하면 인터벌 데이터 처리도 가능한게 아닐까 라는 생각이 드는데요, 맞을까요? 어떤 부분에서 스트림DSL로는 인터벌마다 데이터를 처리하는게 안된다고 하신건지 궁금합니다!
안녕하세요! 지난 1탄 강의 잘 들었습니다. 다름이 아니라 1탄과 2탄에서 go로 작성된 코드가 조금 다른거 같은데 혹시 누락된 강의가 있는걸까요 ? 1탄에선 network 디렉토리에 network.go와 socket.go만 작성했었는데 2탄에선 server.go와 util.go가 생기면서 코드가 조금 변경된거 같습니다. 누락된 강의가 없다면, 변경된 부분이 어떤 것들인지 알고싶어서 질문드립니다.
안녕하세요. kafka 실행중에 다음과같은 connection refused가 나는대 왜그런걸까요?? security group에서 포트 오픈도 하였습니다. INFO Socket error occurred: kafka_03/54.180.82.45:2181: Connection refused (org.apache.zookeeper.ClientCnxn) [2024-05-24 05:47:22,554] INFO Opening socket connection to server kafka_01/0.0.0.0:2181. Will not attempt to authenticate using SASL (unknown error) (org.apache.zookeeper.ClientCnxn) [2024-05-24 05:47:22,554] INFO Socket error occurred: kafka_01/0.0.0.0:2181: Connection refused (org.apache.zookeeper.ClientCnxn) [2024-05-24 05:47:23,656] INFO Opening socket connection to server kafka_02/43.201.26.39:2181. Will not attempt to authenticate using SASL (unknown error) (org.apache.zookeeper.ClientCnxn) [2024-05-24 05:47:23,657] INFO Socket error occurred: kafka_02/43.201.26.39:2181: Connection refused (org.apache.zookeeper.ClientCnxn) [2024-05-24 05:47:23,758] INFO Opening socket connection to server kafka_03/54.180.82.45:2181. Will not attempt to authenticate using SASL (unknown error) (org.apache.zookeeper.ClientCnxn) [2024-05-24 05:47:23,759] INFO Socket error occurred: kafka_03/54.180.82.45:2181: Connection refused (org.apache.zookeeper.ClientCnxn) [2024-05-24 05:47:23,859] INFO Opening socket connection to server kafka_01/0.0.0.0:2181. Will not attempt to authenticate using SASL (unknown error) (org.apache.zookeeper.ClientCnxn)
일단 제 환경은 윈도우구요 apigateway-service 내의 application.yml 파일의 url를 일반 ip 어드레스가 아닌 loadbalancer 방식으로 변경하여 테스트하면 진행되지 않습니다; 트러블슈팅에 장시간이 걸렸는데 혹시나 해서 제 피씨 네임을 인식하지 못하나 해서 hosts 파일에 본인 pc 네임과 127.0.0.1을 추가해주면 됩니다. 만약 네 pc가 '뽀로로'인 경우 뽀로로 127.0.0.1을 'C:\Windows\System32\drivers\etc'의 파일에 추가해줍니다.
안녕하세요, 궁금한 내용이 생겨 기존에 질문들을 살펴보고 제가 이해한 것이 맞는지 확인차 질문드립니다. redis의 싱글스레드 특성으로 100개 발급에 대한 race condition 해결 --> 그러나 insert 시 DB 처리량에 부하가 발생할 수 있음 kafka 미들웨어를 통해 100개의 쿠폰 저장 이벤트를 보관해두었다가 컨슈머에서 원할때 꺼내어 처리할 수 있는 여지를 주어 처리량 부하를 분산시킬 수 있음 ex) 쿠폰 발급은 당장 안해도 되니, kafka에 이벤트만 잘 발행되어 있다면 DB 작업량이 적은 새벽에 꺼내서 저장해도 됨 이렇게 이해했는데, 맞을까요?
안녕하세요, 늘 양질의 강의 제공해 주심에 감사합니다. 강의를 듣다가 알쏭달쏭한 부분이 있어 질문드립니다. Schema Registry 를 활용하여 하위(Backward) 호환성 유지 시, 새로운 스키마를 설정되게 되면 Worker Conenct 를 강제로 실행시켜 줘서 Sink Connector 가 새로운 스키마가 갱신되도록 해줘야하는 절차가 꼭 필요한가요? (Consumer 가 새로운 버전으로 스키마 업데이트가 되도록 강제하기 위한 수동 절차가 꼭 필요한 것인지 궁금합니다. 아님 이러한 부분도 자동으로 Schema registry 에서 Sink 쪽으로 콜백을 주어 캐시된 스키마에 대한 정보 업데이트가 되도록 되는건지,,) (Forward 호환성인 경우) Source Connector 에서 V1 버전 스키마로 메세지를 발행하다가, 어느 순간 신규 스키마 버전 V2 로 메세지를 발행하게 되어 Schema registry 에 V2 가 등록이 된 상태에서, Sink 쪽에서는 이 메세지를 받게 되면 schema id : v2 인 정보를 카프카 메세지 내에 정보를 통해 알게 될텐데, 그럼에도 아직 워커 커넥트 내부 캐시된 스키마 정보엔 v2 가 없더라도, Forward 호환성인 경우에는 Sink Connector(Consumer) 입장에선 Schema registry 를 새로이 호출하여 스키마 업데이트를 하지 않는걸까요 ? 보통 운영환경에서 스키마 관리 자체를 DB source connector 에서 자동으로 만들어주는 스키마가 아니라 Schema registry 에 직접 새로운 스키마를 등록하여 운영환경에서 활용하시는지, 혹은 SOurce connector 의 자동 스키마 완성으로 사용하시는지 궁금 합니다. 양질의 강의에 다시한번 감사드리며 답변 부탁드리겠습니다. 좋은 하루 되세요. 감사합니다.
찾아보니 비슷한 질문이 있었던 거 같은데 현재 실습환경과 100% 일치하지 않아 도움을 구합니다. 실행환경은 다음과 같습니다 인텔리제이 : Build #IU-241.14494.240, built on March 28, 2024 JDK : 17 스프링부트 : 3.2.4 아시다 시피 최신 인텔리제이에서는 실습환경으로 제시되는 2.X 버전의 스프링부트 지원이 되지 않습니다. POM.XML로 강제로 버전을 내리거나 JDK 버전을 내리는 경우 서비스 기동이 제대로 되지 않습니다. 아마 스프링부트 3 버전에서는 JDK 특정 버전 이상을 강제하는 느낌입니다. 현재 pom.xml 설정은 다음과 같습니다. <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.4</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>user-serivce</artifactId> <version>0.0.1-SNAPSHOT</version> <name>user-serivce</name> <description>user-serivce</description> <properties> <java.version>17</java.version> <spring-cloud.version>2023.0.1</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project> 명렁어 실행 시 에러는 다음과 같이 발생합니다. [ERROR] Unknown lifecycle phase ".run.jvmArguments=-Dserver.port=9003". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-vers ion>]:<goal>. Available lifecycle phases are: pre-clean, clean, post-clean, validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sou rces, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-site, site, post-site, site-deploy. -> [Help 1] 동일한 명렁어를 윈도우즈 cmd에서 실행하면 다음과 같습니다. [WARNING] Error injecting: org.springframework.boot.maven.RunMojo java.lang.TypeNotPresentException: Type org.springframework.boot.maven.RunMojo not present at org.eclipse.sisu.space .URLClassSpace.loadClass ( URLClassSpace.java:147 ) (중략) Caused by: java.lang.UnsupportedClassVersionError: org/springframework/boot/maven/RunMojo has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0 본 문제 때문에 강의 진행이 안되고 있습니다. 꼭 해결해 주셨으면 합니다.
@Configuration @EnableWebSecurity public class WebSecurity { extends WebSecurityConfigurerAdapter { private UserService userService; private BCryptPasswordEncoder bCryptPasswordEncoder; private Environment env; public WebSecurity(Environment env, UserService userService, BCryptPasswordEncoder bCryptPasswordEncoder) { this.env = env; this.userService = userService; this.bCryptPasswordEncoder = bCryptPasswordEncoder; } 강의에서 보면 @Configuration으로 WebSecurity클래스가 설정되어있기에 userService, bCryptPasswordEncoder, environment 인스턴스가 준비되어 있다고합니다. 따라서 위의 코드와 같이 생성자주입을 하지않는데, 왜 @Configuration으로 설정되어 있으면 @Autowired로 주입을 받지 않아도 되는 걸까요?
userService의 로그입니다. orderService의 로그입니다. git에 올리신 springboot 3번대로 설정한 결과입니다. 강의에서는, get /user-service/users/{user-id} 호출시 feign client로 orderService로 호출을 하고 userServicedptjdml traceId 와 orderService에서의 traceId 가 동일하다고 설명하셨는데, 직접 해본결과 api호출은 문제없이 되나 두개의 traceId가 다르게 나오는 현상입니다. zipkin에서 확인해봐도 userService -> orderService로 호출되는 형태로 나오지 않고, 각각 따로 나오는 형태입니다. 뭐가문제일까요. userService와 orderService의 application.yml입니다.
현재 카프카로 서버간의 restAPI 통신을 구현하려고 하는데요 예를들어 게시판 생성 요청을 예로 들어보겠습니다. 게시판에는 멤버정보가 들어가는데요 게시판 생성요청 정보에는 게시판 제목 게시판 내용 멤버 id 가 있구요 게시판 생성요청시에 작성자id 를 가지고 멤버 서버로 멤버 정보를 요청하는 방식을 해보려고 합니다. 카프카를 사용할때 1 . 게시판서버 게시판 생성메서드에서 프로듀서로 작성자id 를 특정 토픽에 보내고 2 . 멤버서버에서 컨슈머 리스너를 통해 해당 토픽에 요청정보가 들어오면 3 . 요청을 처리하고 다시 객체를 반환 해줘야 하는데 이것을 다시 프로듀서로 작성하고 4 . 게시판서버에서 리스너로 응답받은 객체를 생성메서드에 주입시켜 게시판을 완성시키려고 했습니다. 찾아보니 컨슈머리스너는 void 이어야 한다고 하더라구요. 그렇게 되면 요청과 응답을 받는것을 어떻게 한 메서드 안에서 처리 해야 할까요 ? 찾아본 방법으로는 kafka rest proxy 라는것도 찾아봤는데 현업에서 사용하는 방법이 따로 있는지 궁금합니다
안녕하세요! 강의 잘 듣고 있습니다. 감사합니다. 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개의 데이터는 어디에 임시저장을 하나요?
안녕하세요 강의에서는 zipkin 명령어창에서 실행시 접속로그가 나오며, orderservice에 주문 요청시 traceid,spanid가 나오지만, 저의 경우에는 zipkin 설치시 sl4fj 바인딩 오류가 있더라고요. 혹시 이 사항이 orderservice에서 로그와 관련된 문제인지 아니면 gradle 설정에 관한 부분인지 어떤 부분을 확인해봐야 될까요? 혹은 스프링부트 3.0버젼부터 되지 않는 부분인가요? *gradle 의존성 설정은 강의와 똑같습니다. **아래는 zipkin설치시 sl4fj 관련된 내용 입니다! SLF4J(W): No SLF4J providers were found. SLF4J(W): Defaulting to no-operation (NOP) logger implementation SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details. SLF4J(W): Class path contains SLF4J bindings targeting slf4j-api versions 1.7.x or earlier. SLF4J(W): Ignoring binding found at [jar:nested:/C:/Users/son/zipkin.jar/!BOOT-INF/lib/log4j-slf4j-impl-2.21.1.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J(W): See https://www.slf4j.org/codes.html#ignoredBindings for an explanation.
docker exec -it kafka kafka-topics.sh --bootstrap-server localhost:9092 --create --topic testTopic 위와 같이 터미널에 토픽생성하는 명령어를 작성하면 아무것도 |움직이지 않고 터미널이 멈춥니다. 도커는 정상적으로 실행하고 kafka,zookeeper도 정상적으로 실행되어있습니다. 도커를 삭제하고 다시 다운로드해서 docker compose사용해서 kafka,zookeeper이미지 다시 작동시켜도 위와같이 토픽생성 명령어 입력하고 작동시 아무것도 안하고 멈춥니다.. (p.s 카프카 컨테이너 cli들어가서도 토픽 생성 명령어 작동시켜도 작동안합니다.) 혹시 해당 문제 해결법 아실까요..?
<상황>지식 공유자님께서 작성해주신 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) } } } 좋은 강의 만들어주셔서 감사합니다!