-
2024.05.08 build server down, Share Data Between MSATIL 2024. 5. 8. 19:52
build server down
프로젝트를 java11에서 17, spring boot 3으로 올리고 나서부터 빌드 시 빌드 서버의 메모리 사용량이 증가한다.
그 후 터져버린다.
음 마이그레이션하면서 gradle 설정을 수정한 것이 있다.
MaxPermSize -> MetaspaceSize이다
일단 MaxMetaspaceSize가 되었어야 했다. MetaspaceSize는 GC가 일어나는 limit를 의미하는 것이다.
java11에서 17로 올리는데 17에서는 해당 설정이 있으면 빌드가 되지 않도록 강제로 막았기에 수정했다.
java 8부터 MaxPermSize 설정이 Ignore 되었지만 죽은 설정으로 계속 붙어있었던 것이다.
근데 java11이었을 때는 터지지 않았던 거 같은데..
좀 더 정확하게 보려면 힙 덤프를 떠서 봐야겠다.
MetaspaceSize는 class, method metadata를 저장하는 영역이다.
MaxMetaspaceSize로 하지 않았으니 안 그래도 class가 많은 프로젝트라서 서버가 메모리 부족으로 터지지 않았나..
MetaspaceSize 덕분에 어플리케이션은 OOM에서 벗어났지만 Max값을 정해놓지 않아서 빌드 시에 클래스 로딩하면서 터지는 거 같다.
- https://johngrib.github.io/wiki/java8-why-permgen-removed/
- https://dev.gmarket.com/88
- https://juneyr.dev/jvm-heap-dump
- https://velog.io/@aki/HotSpot-JVM
.
How to Share Data Between Microservices on High Scale
API
어제에 이어서 MSA간 데이터 전달 방식에 대한 글이다.API를 사용하면 단순하면서 높은 일관성과 로컬 DB 테이블 운영 부담이 줄어들 것이다.
하지만 레이턴시가 있고 많은 서비스가 접근 시 병목 지점이 될 수 있다. 추가로 장애 전염이 된다.
이벤트
카프카 등 이벤트 기반 아키텍처를 사용하면 장애전염에서 부터 벗어날 수 있고 consum하는 속도에 따라 일관성을 유지할 수 있다. 로컬 DB를 운영관리해야 하는 단점이 있다.
하이브리드
음 여기서 말하는 하이브리드 방식이 있는데 이벤트로 정보를 받되 id값만 받아서 저장하고 조회 시 API를 사용한다는 것이다.
이게 좋은지는 모르겠다. 로컬 DB 운영관리 부담은 그대로 가져가고 API의 단점은 모두 가져간다.
'TIL' 카테고리의 다른 글
2024.05.11 Galera cluster DDL (0) 2024.05.11 2024.05.09 gradle cache (0) 2024.05.09 2024.05.07 Sharing Data Between Microservices (0) 2024.05.07 2024.05.06 Galera Crash Recovery (0) 2024.05.06 2024.05.05 Galera IST (0) 2024.05.05