전체 글 (113) 썸네일형 리스트형 대용량 데이터 삽입 시 JPA를 JDBC로 교체한 성능 최적화 사례 문제상황 기존에 대량의 데이터를 데이터베이스에 저장할 때, JPA의 saveAll 기능을 사용하고 있었습니다. 하지만 많은 양의 데이터를 처리할 때 성능 이슈가 발생하여, 보다 효율적인 방법이 필요했습니다. 특히, 한 번에 수천 건의 데이터를 삽입하는 경우, JPA의 saveAll은 예상보다 느린 성능을 보였습니다. 이를 해결하기 위해 JDBC 기반의 batchInsert 방식으로 코드를 개선했습니다. 수정코드 public List bulkInsertSmsMsgSendDetail(SmsQueueDto smsQueueDto, String msgGroupId) { String sql = "INSERT INTO table (msg_id, msg_group_id, recv_no, user_seq, sen.. Redis를 이용한 예약 메세지 시스템 개선: RabbitMQ의 FIFO 한계를 극복한 방법 문제상황 기존 예약 메세지 시스템은 RabbitMQ의 지연 큐를 이용해 메시지의 전송 시간을 TTL(Time To Live)로 설정한 후 메시지를 예약하는 방식으로 구현되었습니다. 이 방식은 선입선출(FIFO) 구조의 특성 때문에 다음과 같은 문제가 발생했습니다:FIFO로 인한 대기 현상: 예를 들어, 3시간 뒤에 전송할 메시지가 먼저 큐에 걸린 경우, 그 이후 1분 뒤에 전송할 메시지가 들어와도 3시간이 지나야 큐에서 빠져나가게 되어, 1분 뒤에 전송되어야 할 메시지가 지연되는 현상이 발생.지연된 예약 메시지: 이로 인해 여러 메시지들이 제때 처리되지 않으면서 예약 메시지 시스템이 올바르게 동작하지 않는 문제가 발생했습니다.해결책 이 문제를 해결하기 위해 Redis의 notify-keyspace-eve.. WebClient를 이용한 백프레셔 적용하기 문제상황 제가 개발하고 있는 SMS 발송 서비스에서, 데이터 발행자가 수신자가 처리할 수 있는 양을 넘는 데이터를 전송하는 문제가 발생했습니다. 즉, 수신자가 감당할 수 없는 속도로 데이터가 쏟아지면서 시스템에 과부하가 걸리는 상황이었습니다. 이런 경우, 발행자가 데이터를 보내는 속도와 수신자가 처리할 수 있는 속도를 조율하는 백프레셔가 필요합니다. 기존코드private void bizppurioSendMsg(CompletableFuture token, MessageReqDto messageReqDto, SmsReqDto smsReqDto) { token.thenAccept(tokenResDto -> { WebClient.builder() .baseUrl(bi.. no more than 500 tokens can be specified firebaseMessaging.sendEachForMulticast(message); 실제 운영 중인 서비스에서 동시에 몇천건씩 fcm token을 이용하여 push를 보내는 기능이 있었다. 잘만 전송되던 푸시가 제목과 같은 에러를 내뱉으며, 오류가 발생하며 실제로 유저에게 푸시가 가지않았다. [오류]no more than 500 tokens can be specified오류내용 그대로 500개 이상은 보낼수없다. [해결]몇천건씩 동시에 발송되는 토큰을 500개씩 잘라, 순차적으로 푸시전송하도록 수정하였다.public static List makeMultiMessages(String title, String body, List targetToken, String msgGroupId, String ad.. spring cloud config vault (그림에는 git 저장소를 이용했지만, 저희는 vault를 이용하였습니다.) 사용이유? 위의 그림으로도 간단히 설명이 가능합니다. spring cloud config는 여러 서비스들의 설정 정보들을 중앙으로 관리하기 용이하도록 도와주는 것입니다. 예를들어 A , B, C 서비스가 있고, 각각의 서비스들은 같은 설정 정보를 사용한다고 가정해봅시다. 설정정보가 바뀌면, A, B, C 모든 서비스에 설정 정보를 수정해야 합니다.그리고 설정 정보를 변경했으므로 모두 재배포를 해야합니다. 그와중 한군데의 설정 정보를 잘못 변경하면 장애로 전파 될 수 있습니다. 그러므로 설정 정보의 변경 시 관리 용이를 위해 외부에 중앙으로 관리하는 것이 관리적인 측면에서 편합니다. 사용법?우선 vault를 설치해야합니다이.. springboot Gateway swagger 적용 (MSA) 사용이유? MSA로 환경을 구축하면, 각 서비스마다 서버가 띄어져있을 것입니다. 그 서비스마다 Swagger를 설정하고 이를 개별로 확인하는 것은 상당히 비효율적이라고 생각합니다. 각 서비스에 도달하기전 Gateway 서비스가 제어를 하는데, 이 Gateway 서비스에 swagger를 적용하면 됩니다. MSA로 어느정도 구축된 환경이라고 생각하고 진행하겠습니다. 또한 이 환경을 기준으로 설명하겠습니다. - Java 17- spring boot 3.2.3- gradle- yaml 설정 1. 의존성 주입https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webflux-ui 위의 링크에서 최신 버전의 의존성 확인이 가능합니다.. No qualifying bean of type 'org.springframework.boot.autoconfigure.http.HttpMessageConverters' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(requ 상황springboot에서 내부통신을 위해 feignClient를 사용. api01 -> api02로 feignClient로 찔렀을때, 제목과 같은 오류가 발생하였다. No qualifying bean of type 'org.springframework.boot.autoconfigure.http.HttpMessageConverters' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 해결전 해결후 원인spring-boot-starter-web 에.. FeignClient 를 활용해보기(feat. Eureka) https://yjkim-dev.tistory.com/109 Spring Cloud Gateway, Eureka 사용해보기 Eureka란? Neflix에서 제공하는 MSA를 위한 클라우드 오픈 소스입니다. 정의는 LB 와 Middle-tier server에 에러 대응을 위한 REST 기반 서비스입니다. Eureka를 왜 쓸까? LB는 MSA의 각 모듈에 대한 연결 정보(ip, yjkim-dev.tistory.com 를 먼저 보고오시는 것을 추천합니다. (내용이 이어지기때문) MSA에서는 내부통신이 많이 일어납니다. 주로 Eureka에 등록해놓고, 그 인스턴스의 정보를 가져와 주소를 알아내고 요청을 합니다. 1번서버는 2번서버의 리턴값을 리턴하는 서비스가 있고, 2번서버는 문자열 "2번서버"를 리턴하는 서.. 이전 1 2 3 4 ··· 15 다음