본문 바로가기

BackEnd36

[Spring] webflux에서 별도의 스케줄러를 이용하여 cpu bound 작업 처리 vs 그냥 처리 webflux로 구현되어 있다면, blocking call이 있을 경우 성능이 크게 저하됩니다. blocking이 있는지 검출하기 위해 blockhound를 사용하여 감지할 수 있습니다. 만약 blokcing call이 있다면, 와 같은 에러 메시지가 발생합니다. 이는 snappy로 압축하는 부분에서 발생한 에러입니다. 이 blocking call을 피하기 위해서는 별도의 스케줄러를 이용해서 처리하라고 합니다.(출처 : https://www.baeldung.com/java-handle-blocking-method-in-non-blocking-context-warning) 그래서 이렇게 수정을 하면, block hound에서는 더 이상 에러가 발생하지 않습니다. 그러면 이 경우에는 성능이 개선이 되었을.. 2025. 5. 22.
[Spring] bean이 없는 경우 허용하도록 처리 글로벌 프로젝트를 진행하고 있고, 나라마다 법률이 다릅니다. 나라마다 개인 정보를 저장하기 위해서 필요한 정보가 다르고 보관 기간이 다릅니다.국내 서비스 개인 정보를 저장하기 위한 모듈을 만들면서 마주친 문제입니다. 문제현재 프로젝트 구조는 헥사고날 구조로 이루어져 있습니다. 비즈니스 로직은 나라가 서로 동일하지만, 데이터를 가져오는 방식이 다릅니다. 즉, 나라마다 apdater를 구현하도록 할 수 있습니다.서비스 제공 사양은 동일하여 controller는 하나로 구현되어 있습니다. 그렇다보니 국내 서비스를 위해서 개인 정보 로깅 로직이 들어가면, 다른 나라 서비스에 영향을 줄 수도 있습니다.이를 해결하기 위해 해당 bean이 있을 경우에만 동작하도록 할 필요가 있었습니다. 하지만 spring을 이.. 2025. 5. 1.
[JAVA] logback gz 압축 방법 최근 회사에서 위치 정보를 보관하기 위한 모듈을 만들고 있습니다.사실 제 서비스에서만 돌아가도록 구현을 해도 상관 없지만, 팀 내에 다른 서비스에도 적용해야 하기 때문에 이왕이면 모듈화를 시켜서 팀의 생산성을 높이고 싶어서 모듈을 만들었습니다. 이 과정에서 logback 내부를 뜯어보면서 많은 점을 배웠습니다. 이 점을 공유하려고 해당 글을 작성하게 되었습니다. RollingPolicy위치 정보를 파일로 남기는 방식으로 진행이 되게 됩니다.그러기 위해서는 logback의 FileAppender를 이용하고 rolling policy를 이용하면 편합니다. spring 개발자라면 TimeBased나 SizeAndTimeBased를 자주 이용하실 것입니다. 하루가 지나면, 이 로그를 gz로 압축하는 등의 작업.. 2025. 4. 29.
[DB, REDIS] PostgreSQL 및 Redis Cluster 관련 이슈 팀원이 운영하는 서비스에 장애가 났었습니다.그래서 같이 원인을 찾아봤습니다. 1. 문제 상황PostgreSQL 를 사용하고 있습니다.  여기서 문제는 해당 Table 을 조회하는 쿼리를 잘못 전송해서 db disk 사용량이 급격히 증가했고, 이 타이밍에 partition table 만드는 작업이 수행이 되어서 db lock이 걸려서 문제가 되었습니다.  Redis의 경우에는 master node가 종료됨에 따라서 데이터를 write를 못하는 현상이 있었고, 서비스를 사용자에게 제공하기 까지의 시간이 매우 오래 걸리는 문제가 있었습니다.  2. 원인PostgreSQL의 disk 사용량이 급격하기 늘어난 이유는 temp file 때문입니다.PostgreSQL은 sorting을 할 때, worker memor.. 2025. 2. 25.
[Spring] redis stream 최근 회사에서 로깅 로직 때문에 성능 저하가 있었습니다.요청 -> 로그 DB 적재 형태로 되어 있다 보니 트래픽이 많이 발생하게 되면 connection pool , insert 성능 등 문제가 있었습니다. 그래서 로그를 DB에 바로 적재하는 방식이 아니라 중간에 로그를 모아서, bulk로 insert 하도록 로직을 수정하려고 했습니다.이를 위해 redis stream을 이용했습니다.  1. redis stream이란?redis에는 다양한 자료 구조가 있습니다.이중에서 이벤트 소싱처럼 쓰기 적절한 자료구조로 list, pub/sub, stream 이 있습니다. pub/sub의 경우에는 중복 없이 데이터를 동시에 처리할 수가 없습니다. 예를 들면, test_topic이라는 topic이 있고, 이를 여러 c.. 2024. 12. 17.
로깅 로직 수정 1. 문제 상황트래픽이 몰리는 시간 대에 response time이 지연되는 현상이 있었습니다. 로깅 툴을 보니 jdbc 커넥션을 맺거나 db에 insert하는 데에 많은 시간이 걸리고 있었습니다. 2. 원인제가 맡은 서비스는 아니였지만, 최근에 도메인을 넓히면서 해당 서비스도 보고 있었습니다. 이 서비스는 사용자 요청이 오면 이를 처리한 후 DB에 로그 데이터를 넣는 방식으로 동작하고 있었습니다. DB의 insert 작업은 조회에 비쌉니다.(다행히도 index는 걸려있지 않았었습니다. 해당 로그를 조회할 일이 크게 없어서 그런가봅니다...)그렇다보니 부하가 발생하면 해당 작업을 처리하기까지 connection pool을 차지하고 있을 것이고 다른 요청들은 남는 connection pool이 없어서 대기.. 2024. 12. 15.