본문 바로가기

스프링

Nginx로 로드 밸런싱과 부하 테스트 1. 서론2. 테스트3. 결론1. 서론프로젝트에서 '한 개의 Nginx 서버'가 '두 개의 스프링 서버'로 요청을 로드 밸런싱 하도록 했습니다.그에 따라 서버를 scale-out 하면 어느 정도의 부하까지 견딜 수 있는지 테스트하고자 했습니다. 2. 테스트취준생 입장에서 서버 요금은 부담스럽기 때문에, AWS와 네이버 클라우드의 프리티어를 최대한 활용했습니다. 필요한 서버Spring WAS 서버 2개Nginx 로드 밸런싱 서버 1개 (네이버 클라우스 micro server)RDS 1개 (AWS  db.t3.micro)10만 User, 10만 Contract, 30만 Board 데이터 부하JMeter로 초당 300 스레드를 20회 반복하여, 총 6000번 요청했습니다. 테스트 목록2-1. Spring 서버.. 더보기
Spring 세션과 Redis를 활용한 조회수 증가 중복 방지 1. 서론2. 여러 방법과 비교3. 구현4. 마무리 1. 서론프로젝트를 진행하면서 게시글의 조회수를 카운트하도록 했습니다.여러 서비스들을 살펴봤을 때, 새로고침을 할 때마다 조회수가 증가되는 서비스가 있었고, 새로고침하여도 조회수가 증가 되지 않도록 중복을 방지한 서비스도 있었습니다. 다른 서비스들은 조회수 증가의 중복을 방지하기 위해 어떤 방법을 사용하는지 알아봤는데, 그 중 대표적으로 유튜브는사용자가 의도적으로 동영상을 시작한다사용자는 적어도 30초동안 영상을 시청한다최대 반복수는 300번으로 예상된다최대 반복수를 넘었을 시 봇을 이용하는지 유효성 검사 단계가 수행되면서 더 이상 조회수가 증가하지 않는다조회수 증가하지 않는 상황많은 장치에 대해 하나의 IP 주소를 사용하여 동시에 동일한 영상을 시청할.. 더보기
(2) Mysql 실행 계획 분석 및 쿼리 튜닝 1. 서론2. 쿼리 응답 속도3. 부하 테스트4. 실행 계획 분석5. 쿼리 튜닝6. Spring에서 쿼리 힌트7. 결과8. 결론과 마무리 1. 서론지난 글에서 QueryDsl을 사용하여 DTO 조회로 극한의 성능 최적화를 진행했었습니다. 그때 결과적으로 약 6배 이상의 성능이 개선되었는데,데이터를 가져오는 양과 트랜잭션 범위의 차이에 의한 것이라고 생각했었습니다. 하지만 김영한님의 강의에서 요즘은 네트워크 성능이 좋아졌기 때문에 성능상 크게 차이가 나지 않을 것이라 하였고, 그렇다면 트랜잭션의 범위 차이와 user_roles 쿼리 한번의 추가로 6배나 차이가 생길까? 하는 의문이 계속 들었습니다. 그래서 테스트 했던 것을 다시 회고하는 중에, 엔티티로 모두 조회하는 쿼리에 포함되어 있던 distinct가.. 더보기
(2) 스프링 Redisson 분산락 진행 중인 프로젝트는 여러 개의 서버가 nginx로 로드밸런싱 되고 있고, DB는 Master-Slave 구조로 이중화되어 있다. 이런 환경에서는 어떤 락을 사용해서 동시성 문제를 해결해야 할까 ? 목차 1. 분산락이란 2. 다른 방식의 락은 동시성 문제를 해결할 수 없나 ? 3. Redisson vs Lettuce 4. AOP를 이용한 분산락 5. 낙관적 락, 비관적 락, 분산 락 테스트 6. 결론 1. 분산락이란 분산락은 여러 서버 또는 DB에서 공유되는 데이터의 동시성 문제를 해결하기 위해 사용하는 기술이다. lock을 획득한 프로세스 or 스레드가 공유되는 데이터 or critical section에 접근할 수 있도록 하여 race condition을 방지한다. 2. 다른 방식의 락은 동시성 문제.. 더보기
(1) 스프링 동시성 문제 1. 서론 나의 프로젝트들 중에는 '조회수'와 '북마크 수'를 카운트하는 기능이 있다. 조회수가 증가하는 로직은 중복을 방지하여 사용자가 게시글을 조회하면 조회수에 + 1 갱신 북마크 수는 DB 테이블을 반정규화하여 Board 테이블의 컬럼에 북마크 수를 두고, 사용자가 게시글을 북마크하거나 해제하면 +1, -1 하도록 구현했다. 얼마전 유튜브를 보다가 실제 인스타그램에서도 좋아요 수를 표시하기 위해 이렇게 테이블을 구성했다고 한다. 나의 기능들을 보면, 조회수나 북마크 수는 비즈니스에 엄청난 영향을 미치는 것은 아니기에 무시할 수도 있다. 하지만 상품의 재고 수량과 계좌의 입출금 같은 경우 동시성 문제가 일어난다면 비즈니스에 치명적인 피해를 입힐 것이다. 2. 동시성 문제가 뭔데 ? 하나의 자원을 2개.. 더보기
DB Replication / Master-Slave 이중화 with Spring 목차 1. Master-Slave 구조란 ? 2. DB Replication으로 Master-Slave 구조를 사용할 때 장점과 단점 3. 스프링에서 설정하기 1. Master-Slave 구조란 ? DB 시스템에서 사용되는 복제(Replication) 형태이다. Master DB에서는 주로 쓰기 작업을 처리하고, Slave DB에서 읽기 작업들을 처리하여 부하를 분산하고 가용성을 높일 수 있다. 하지만 이렇게 작업을 나누면 DB들 간의 데이터 정합성 문제가 생길 수 있다. 데이터를 동기화 시키기 위해 MySQL에서는 기본적으로 비동기 복제 방식을 사용하고 있다. Master DB에서 쓰기, 삭제, 수정 작업이 일어나서 변경이 생기면, 이를 비동기적으로 Binary Log에 기록하고 Master Threa.. 더보기
(2) 스프링 직렬화 For RedisCache, RedisSerializer 직렬화란 ? 자바 직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)을 아울러서 이야기합니다. 이를 시스템적으로 얘기하자면 JVM(Java Virtual Machine 이하 JVM)의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술과 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태입니다. 즉 Redis는 Key와 Value를 byte 배열 형태로 저장하기 때문에, 자바의 데이터들을 Redis에 저장하기 위해서는 직렬화하여야 하고, Redis에 저장된 값들을 자바에서 사용하기 위해서는 역.. 더보기
(1) Redis란 ? Redis Redis is an open source (BSD licensed), in-memory data structure store used as a database, cache, message broker, and streaming engine. Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions, and different levels of .. 더보기