안녕하세요. 강의 잘 듣고 있습니다. Kafka Connector 연결 부분에서 "my-source-connect" 를 등록하기 위해 POST 요청을 보내면, 아래와 같은 에러 로그가 발생합니다. (postman에서는 등록 요청시에는 201로 나오지만, status를 조회할 경우에는 fail로 나옵니다.) 무슨 이유인지 알 수 있을까요? [2024-10-22 21:39:08,470] ERROR WorkerConnector{id=my-source-connect} Error while starting connector (org.apache.kafka.connect.runtime.WorkerConnector:193) java.lang.NoSuchMethodError: 'boolean org.apache.kafka.common.utils.Utils.isBlank(java.lang.String)' at io.confluent.connect.jdbc.util.StringUtils.isNotBlank(StringUtils.java:79) at io.confluent.connect.jdbc.dialect.GenericDatabaseDialect.getJdbcCredentialsProvider(GenericDatabaseDialect.java:2010) at io.confluent.connect.jdbc.dialect.GenericDatabaseDialect.<init>(GenericDatabaseDialect.java:192) at io.confluent.connect.jdbc.dialect.MySqlDatabaseDialect.<init>(MySqlDatabaseDialect.java:67) at io.confluent.connect.jdbc.dialect.MySqlDatabaseDialect$Provider.create(MySqlDatabaseDialect.java:57) at io.confluent.connect.jdbc.dialect.DatabaseDialects.findBestFor(DatabaseDialects.java:134) at io.confluent.connect.jdbc.JdbcSourceConnector.start(JdbcSourceConnector.java:87) at org.apache.kafka.connect.runtime.WorkerConnector.doStart(WorkerConnector.java:185) at org.apache.kafka.connect.runtime.WorkerConnector.start(WorkerConnector.java:210) at org.apache.kafka.connect.runtime.WorkerConnector.doTransitionTo(WorkerConnector.java:349) at org.apache.kafka.connect.runtime.WorkerConnector.doTransitionTo(WorkerConnector.java:332) at org.apache.kafka.connect.runtime.WorkerConnector.doRun(WorkerConnector.java:140) at org.apache.kafka.connect.runtime.WorkerConnector.run(WorkerConnector.java:117) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:833) [2024-10-22 21:39:08,472] INFO [Worker clientId=connect-1, groupId=connect-cluster] Session key updated (org.apache.kafka.connect.runtime.distributed.DistributedHerder:1578) [2024-10-22 21:39:08,474] ERROR [Worker clientId=connect-1, groupId=connect-cluster] Failed to start connector 'my-source-connect' (org.apache.kafka.connect.runtime.distributed.DistributedHerder:1339) org.apache.kafka.connect.errors.ConnectException: Failed to start connector: my-source-connect
모든강의를 구매할 예정입니다. 스프링 강의를 제외하고 구매하고싶습니다만 현재 까지 강의를 들었을때 제가 스프링 서버를 두개를 뛰운다음에 유레카로 로드밸런싱하는것 같은데 필요에따라서(서비스요청이 많아지면)자동적이게 설정한대로 확장하게 만들수 있나요? 이건 젠키스 강의로봐야하나요? - 오토스케일링 여부 또한 하나의 ec2 에 모든 로직을 넣어서 확장하는게 아니라 여려 ec2 에서 스케일링 하는 강의가있나요? 스프링 배포까지 공부해야할까요? -ec2 분산 여부
클러스터 생성(실습) 강의 보며 따라하고 있었는데 용량 공급자 인스턴스를 클러스터의 컨테이너 인스턴스 등록위해 vpc endpoint를 생성해주려고 하는데 VPC 엔드포인트를 생성하는 중 오류 발생 Enabling private DNS requires both enableDnsSupport and enableDnsHostnames VPC attributes set to true for vpc 이런 에러가 나오는데 혹시 따로 해제해야 하는 DNS설정이 존재하는지 궁금합니다!
강의 너무 잘 듣고 있습니다! aws 사용만 할줄 알았지 이렇게 심도있게 공부하는건 처음인거 같습니다! 저는 강사님이 하신 코드와 비슷하게 쇼핑몰 웹사이트 백엔드 개발을 해보려고 user, product 서버를 만들고 aws ecr과 aws ecs를 이용해서 배포하려고 했습니다. 그래서 vpc부터 alb까지 따라했고, aws ecs 태스크, 클러스트까지 만들었지만 ecs 서비스를 만들려고 할때 user-service 배포 중 오류가 발생했습니다.Resource handler returned message: "Error occurred during operation 'ECS Deployment Circuit Breaker was triggered'." (RequestToken: a2db5dfb-7a55-ce69-fb99-854b5e0efc28, HandlerErrorCode: GeneralServiceException) health-check는 200으로 잘 돌아오는데 계속 서비스 생성에 실패하는 오류가 발생합니다. 서버 2개가 있는데 서버별로 각각 task를 만들고, 그에 해당하는 서비스도 각각 생성해야 하는게 맞는지 여쭤보고 싶었습니다.
서비스 로직이 실행될때 Kafka 통해 이벤트를 발행하는 순간 클라이언트 응답이 성공으로 나가는데 만약 이 이벤트를 처리하는 컨슈머쪽에서 실패한다고하면 클라이언트 응답은 이미 성공으로 보내졌는데 실패했다는걸 어떻게 알리나요? 보상트랜잭션을 발행해서 데이터를 되돌리는건 이해가 되지만 클라이언트 응답에 대해서는 어떻게 해야될지 궁굼합니다 Ex) 주문후 재고감소 이벤트를 발행하는 순간 클라이언트 응답은 성공으로감 하지만 재고감소하는 서비스에서 실패를 한다고하면?
AWS ECS를 통해 MSA 프로젝트를 배포하려고 노력중입니다. Eureka, Api Gateway, 그리고 나머지 서비스를 배포하려고 하는데, 유레카가 ECS 환경에서 잘 검색하고 있지 못한 것 같습니다. 왜 이런지 도저히 감이 안잡혀서 질문 올립니다. 그림에 있는 것과 마찬가지로 모두 같은 ip 주소를 가져오고 있습니다. AWS ECS (Fargate) 환경이고, ALB 사용중입니다. 제 추측으로는 저 공통된 ip 주소가 ALB의 ip 주소이지 않을까 해서 다양한 방법을 시도해봤지만 private ip를 유레카가 가지고 있게 하는 것을 실패했습니다.
Riot API Limit을 보면 이렇게 Rate Limit이 있다고 설명되어 있는데요. 이를 위해서 CustomCircuitBreaker를 아래와 같이 개발해봤습니다. @Bean(name = "shortTermCircuitBreaker") public CircuitBreaker shortTermCircuitBreaker(CircuitBreakerRegistry registry) { return registry.circuitBreaker("shortTermBreaker", CircuitBreakerConfig.custom() .slidingWindowType(CircuitBreakerConfig.SlidingWindowType.TIME_BASED) .failureRateThreshold(1) .slidingWindowSize(1) .waitDurationInOpenState(Duration.ofSeconds(1)) // open -> half open까지 기다리는 시간 .automaticTransitionFromOpenToHalfOpenEnabled(true) // open 상태에서 자동으로 half open으로 전환 .build() ); } @Bean(name = "longTermCircuitBreaker") public CircuitBreaker longTermCircuitBreaker(CircuitBreakerRegistry registry) { return registry.circuitBreaker("longTermBreaker", CircuitBreakerConfig.custom() .slidingWindowType(CircuitBreakerConfig.SlidingWindowType.TIME_BASED) .failureRateThreshold(1) .slidingWindowSize(120) .waitDurationInOpenState(Duration.ofMinutes(2)) // open -> half open까지 기다리는 시간 .automaticTransitionFromOpenToHalfOpenEnabled(true) // open 상태에서 자동으로 half open으로 전환 .build() ); } 제가 궁금한 점은 slidingWindowType을 TIME_BASED로 했을 경우, slidingWindowSize에 들어가는 값의 단위가 초 단위인가 하는 것입니다. 공식 문서에는 이렇게 나와있는데 애매한 것 같아서요.
강의에서 알려주신대로 my-source-connect라는 connector를 등록한 후 http://localhost:8083/connectors 로 GET 조회시 아래와 같이 connector가 잘 뜨는 것을 확인하고 http://localhost:8083/connectors/my-source-connect/status 로 GET 조회시 아래와 같은 오류 메시지가 응답됐습니다. { "name": "my-source-connect", "connector": { "state": "FAILED", "worker_id": "127.0.0.1:8083", "trace": "java.lang.NoSuchMethodError: 'boolean org.apache.kafka.common.utils.Utils.isBlank(java.lang.String)'\n\tat io.confluent.connect.jdbc.util.StringUtils.isNotBlank(StringUtils.java:79)\n\tat io.confluent.connect.jdbc.dialect.GenericDatabaseDialect.getJdbcCredentialsProvider(GenericDatabaseDialect.java:2010)\n\tat io.confluent.connect.jdbc.dialect.GenericDatabaseDialect.<init>(GenericDatabaseDialect.java:192)\n\tat io.confluent.connect.jdbc.dialect.MySqlDatabaseDialect.<init>(MySqlDatabaseDialect.java:67)\n\tat io.confluent.connect.jdbc.dialect.MySqlDatabaseDialect$Provider.create(MySqlDatabaseDialect.java:57)\n\tat io.confluent.connect.jdbc.dialect.DatabaseDialects.findBestFor(DatabaseDialects.java:134)\n\tat io.confluent.connect.jdbc.JdbcSourceConnector.start(JdbcSourceConnector.java:87)\n\tat org.apache.kafka.connect.runtime.WorkerConnector.doStart(WorkerConnector.java:185)\n\tat org.apache.kafka.connect.runtime.WorkerConnector.start(WorkerConnector.java:210)\n\tat org.apache.kafka.connect.runtime.WorkerConnector.doTransitionTo(WorkerConnector.java:349)\n\tat org.apache.kafka.connect.runtime.WorkerConnector.doTransitionTo(WorkerConnector.java:332)\n\tat org.apache.kafka.connect.runtime.WorkerConnector.doRun(WorkerConnector.java:140)\n\tat org.apache.kafka.connect.runtime.WorkerConnector.run(WorkerConnector.java:117)\n\tat java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)\n\tat java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)\n\tat java.base/java.lang.Thread.run(Thread.java:840)\n" }, "tasks": [], "type": "source" } kafka connect 터미널 로그에는 다음과 같이 찍혀있었습니다. [2024-10-13 23:15:36,747] ERROR WorkerConnector{id=my-source-connect} Error while starting connector (org.apache.kafka.connect.runtime.WorkerConnector:193) java.lang.NoSuchMethodError: 'boolean org.apache.kafka.common.utils.Utils.isBlank(java.lang.String)' at io.confluent.connect.jdbc.util.StringUtils.isNotBlank(StringUtils.java:79) at io.confluent.connect.jdbc.dialect.GenericDatabaseDialect.getJdbcCredentialsProvider(GenericDatabaseDialect.java:2010) at io.confluent.connect.jdbc.dialect.GenericDatabaseDialect.<init>(GenericDatabaseDialect.java:192) at io.confluent.connect.jdbc.dialect.MySqlDatabaseDialect.<init>(MySqlDatabaseDialect.java:67) at io.confluent.connect.jdbc.dialect.MySqlDatabaseDialect$Provider.create(MySqlDatabaseDialect.java:57) at io.confluent.connect.jdbc.dialect.DatabaseDialects.findBestFor(DatabaseDialects.java:134) at io.confluent.connect.jdbc.JdbcSourceConnector.start(JdbcSourceConnector.java:87) at org.apache.kafka.connect.runtime.WorkerConnector.doStart(WorkerConnector.java:185) at org.apache.kafka.connect.runtime.WorkerConnector.start(WorkerConnector.java:210) at org.apache.kafka.connect.runtime.WorkerConnector.doTransitionTo(WorkerConnector.java:349) at org.apache.kafka.connect.runtime.WorkerConnector.doTransitionTo(WorkerConnector.java:332) at org.apache.kafka.connect.runtime.WorkerConnector.doRun(WorkerConnector.java:140) at org.apache.kafka.connect.runtime.WorkerConnector.run(WorkerConnector.java:117) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:840) [2024-10-13 23:15:36,747] ERROR [Worker clientId=connect-1, groupId=connect-cluster] Failed to start connector 'my-source-connect' (org.apache.kafka.connect.runtime.distributed.DistributedHerder:1339) org.apache.kafka.connect.errors.ConnectException: Failed to start connector: my-source-connect at org.apache.kafka.connect.runtime.distributed.DistributedHerder.lambda$startConnector$5(DistributedHerder.java:1305) at org.apache.kafka.connect.runtime.WorkerConnector.doTransitionTo(WorkerConnector.java:335) at org.apache.kafka.connect.runtime.WorkerConnector.doRun(WorkerConnector.java:140) at org.apache.kafka.connect.runtime.WorkerConnector.run(WorkerConnector.java:117) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:840) 다음은 제가 시도해본 해결방법 3가지 입니다. 테이블 이름 수정 https://www.inflearn.com/community/questions/618181/source-connector-%EC%98%A4%EB%A5%98?srsltid=AfmBOooaiA_jLl3ijo0mPjPhnhjM4FQeCSDVdXjgXAAHMsN7sojnFkIR users 테이블은 예약어라고 해서 user1으로 수정해서 POST 요청을 보냈을 때는 아래와 같이 응답이 잘 왔습니다. mariadb-java-client.jar 파일 올바른 폴더에 넣기 https://www.inflearn.com/community/questions/970970/kafka-connectors-%EC%97%90%EB%9F%AC?srsltid=AfmBOoopKwFbCFMIgaLAKg5-4urO7Fzzxwl2ChzmqH8evzNEc4H1ECsD 다음 글을 참고해서 mariadb-java-client.jar 파일을 아래와 같이 kafka 폴더에 옮겨 놓았습니다 플러그인 확인 https://www.inflearn.com/community/questions/245034/localhost-8083-connectors-%ED%98%B8%EC%B6%9C%EC%8B%9C-%EC%97%90%EB%9F%AC%EA%B0%80-%EB%B0%9C%EC%83%9D%ED%95%A9%EB%8B%88%EB%8B%A4?srsltid=AfmBOophiRaXpfFVHkArBbyirgaPdUfbGUP2W8o5Px-k_ZZDJ2b7wgmf 다음 글을 참고해서 http://localhost:8083/connector-plugins [ { "class": "io.confluent.connect.jdbc.JdbcSinkConnector", "type": "sink", "version": "10.8.0" }, { "class": "io.confluent.connect.jdbc.JdbcSourceConnector", "type": "source", "version": "10.8.0" }, { "class": "org.apache.kafka.connect.file.FileStreamSinkConnector", "type": "sink", "version": "6.1.0-ccs" }, { "class": "org.apache.kafka.connect.file.FileStreamSourceConnector", "type": "source", "version": "6.1.0-ccs" }, { "class": "org.apache.kafka.connect.mirror.MirrorCheckpointConnector", "type": "source", "version": "1" }, { "class": "org.apache.kafka.connect.mirror.MirrorHeartbeatConnector", "type": "source", "version": "1" }, { "class": "org.apache.kafka.connect.mirror.MirrorSourceConnector", "type": "source", "version": "1" } ] 다음과 같이 응답이 왔습니다. jdbc connector는 잘 등록된 것 같습니다.. 뭐가 문제일까요?
DevOps를 위한 Docker 가상화 기술 (Private Harbor Registry)
service create 시에 아래와 같이 에러가 발생합니다. 에러가 발생한 노드의 ps list 입니다. create만 되고 up이 되지않은 상황입니다. 에러를 자세히 확인 해보니 아래의 스크린샷과 같이 되어있습니다. starting container failed: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: can't copy bootstrap data to pipe: write init-p: broken pipe: unknown 어떻게 해결할 수 있을까요?
안녕하세요 강사님, 강의 영상 잘 보고 있습니다. first-service, second-service 둘다 실행 후에 apigateway-service 실행했습니다. 그런데 apigateway 쪽에서 연결 거부 당했다는 로그가 지속적으로 올라오네요 이유를 모르겠습니다. apigateway 의 application yml파일 여기서 궁금한게 defaultZone 설정 해서, discoveryservice 프로젝트도 구동 시켜줬는데, 같은 에러로그가 지속 적으로 올라오네요.. server: port: 8000 eureka: client: register-with-eureka: false fetch-registry: false service-url: defaultZone: http://localhost:8761/eureka spring: application: name: apigateway-service cloud: gateway: routes: - id: first-service uri: localhost:8081/first-service predicates: # ??? Path ??? first-service?? ?? uri? ?? - Path=/first-service/** - id: second-service uri: localhost:8082/second-service predicates: # ??? Path ??? second-service?? ?? uri? ?? - Path=/second-service/** 콘솔 내용 2024-10-07 20:39:53.214 WARN 2024 --- [OvbxrBtUd7XQ-87] o.s.a.r.l.SimpleMessageListenerContainer : Consumer raised exception, processing can restart if the connection factory supports it. Exception summary: org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused: no further information 2024-10-07 20:39:53.214 INFO 2024 --- [OvbxrBtUd7XQ-87] o.s.a.r.l.SimpleMessageListenerContainer : Restarting Consumer@4dca89d2: tags=[[]], channel=null, acknowledgeMode=AUTO local queue size=0 2024-10-07 20:39:53.215 INFO 2024 --- [OvbxrBtUd7XQ-88] o.s.a.r.c.CachingConnectionFactory : Attempting to connect to: [localhost:5672] 추가 예외 2024-10-07 20:51:37.290 INFO 18012 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at : http://localhost:8888 2024-10-07 20:51:37.304 INFO 18012 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Connect Timeout Exception on Url - http://localhost:8888. Will be trying the next url if available 2024-10-07 20:51:37.304 WARN 18012 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Could not locate PropertySource: I/O error on GET request for "http://localhost:8888/apigateway-service/default": Connection refused: no further information; nested exception is java.net.ConnectException: Connection refused: no further information
게이트웨이 서버 로그를 확인하던 중에 문득 이러한 생각이 들었습니다. 만약 이 프로젝트가 유저가 굉장히 많은 서비스라면 게이트웨이 자체에 부하가 생길 수 있을 것 같습니다. 요청의 수가 굉장히 많아 질 것 같은데, 이러한 경우에 부하분산을 어떻게 해야할까? 게이트웨이 하나에 모든 요청(각 서비스, 모니터링등등)이 많아지면 게이트웨이 서버에 문제가 생기지 않을까? 라는 생각이 들었습니다. 스케일업, 스케일아웃 이전에 부하분산할 수 있는 방법을 혹시 제시해주실 수 있으실까요? 현업에서는 어떻게 처리하는지 궁급합니다. 또 게이트웨이 서버를 하나 더 띄웠을때 시스템이 더 복잡해질 것 같은데, 어떤 방법들을 사용하고 어떤 점들이 고려되는지도 궁금합니다.