전체 글66 모니터링과 api 비교 진행중인 프로젝트가 마무리 단계에 접어들어서 실제 런칭후에 사용할 모니터링을 위해 미리 알아보고 테스트 해보려고한다일단 선택한 툴을 prometheus - grafana 를 이용해서 시각화된 모니터링 정보를 얻으려고 한다prometheus - grafana 같은 경우 무료로 사용할 수 있고 다양한 메트릭스를 하나의 툴로 시각화 할 수 있는 장점이 있다그리고 시각화 정보를 개인 커스텀이 가능하고, 자체 커뮤니테에서 사용자들이 만들어놓은 대시보드를 사용하고, 참고할 수 있는 장점이 있다그래서인지 모니터링 툴을 찾아보면 가장 많은 정보가 나와있는 툴이 prometheus - grafana 다. 모니터링을 하려면 메트릭스 정보를 수집하고 넘겨주어야 하는데 server 에는 node exporter, redis .. 2024. 8. 14. 동시성 제어 테스트 코드와 embedded redis 동시성 제어 테스트테스트 코드 작성 @Test fun testConcurrencyControl() { val threadCount = 100 val recruitNum = 50 val executor = Executors.newFixedThreadPool(threadCount) val barrier = CyclicBarrier(threadCount) repeat(threadCount) { memberRepository.save( Member( id = it.toLong() + 1L, email = "test@test.te.. 2024. 8. 4. 동시성 제어 기술 선택 동시성 제어 코드 작성사용한 기술 : Redisson후보 목록 : Redisson, lettuce, mySQL lock장단점 비교 및 채택 이유MySQL Lock- 해당 lock 은 DB에 직접 락을 거는 방식으로 DB내에서 트랜잭션에 대한 락을 거는 방식이다비관적락, 낙관적락, 네임드락으로 소분할 수 있는데비관적 락 같은 경우 구현이 간단하고 성능 저하가 우려되지 않는 동시에 DB 단의 락을 이용하기 때문에 데이터 무결성을 보증할 수 있지만 데드락 문제가 있고 트랙잭션 락이 끝나지 않으면 다음 트랙잭션의 대기가 우려된다낙관적 락을 사용할 경우 해당 트랙잭션이 길어진다고 하더라도 다른 트랙잭션에 영향을 주지 않지만 로직이 비관적 락보다 복잡하고 재시도를 여러번 해서 성능 저하가 우려된다네임드 락을 사용할.. 2024. 8. 4. N+1 fun getStepOverview(enterpriseId: Long, stepId: Long): StepOverviewResponse { val step = stepRepository.findByIdOrNull(stepId) ?: throw ModelNotFoundException("Step", stepId) if (enterpriseId != step.mvpTest.enterpriseId) throw NoPermissionException(MvpTestErrorMessage.NOT_AUTHORIZED.message) //테스트 참여자, 해당 step의 리포트 한꺼번에 불러오기 val members = member.. 2024. 8. 2. lock 구현 방식 Redis 기반의 RedlockRedlock은 Redis를 이용한 분산 락 구현 방법입니다. Redlock 알고리즘은 높은 가용성과 신뢰성을 보장하기 위해 여러 개의 Redis 인스턴스를 사용하여 락을 관리합니다.구현 방식:다섯 개의 Redis 노드에 락을 요청.과반수 이상의 노드에서 락 획득 성공 시 락 획득으로 간주.TTL(Time To Live)을 설정하여 락의 유효 기간을 제한.락 해제 시 다섯 개의 노드에서 락을 해제.장점:고가용성: 여러 노드에서 락을 관리하므로, 일부 노드가 다운되어도 락이 유지됩니다.분산 환경 적합: 분산 시스템에서의 동시성 제어에 적합합니다.단점:복잡성: 다중 노드를 관리해야 하므로 구현과 운영이 복잡합니다.네트워크 오버헤드: 다수의 노드와 통신하므로 네트워크 오버헤드가 .. 2024. 7. 26. 동시성 제어 비관적 락 (Pessimistic Lock)비관적 락은 트랜잭션이나 스레드가 리소스(데이터, 메모리 등)에 접근하기 전에 해당 리소스를 잠금으로써 다른 트랜잭션이나 스레드가 접근하지 못하도록 하는 방법입니다. 이는 데이터에 대한 충돌이 자주 발생하는 환경에서 효과적입니다.장점:일관성 유지: 리소스에 대한 접근이 잠금으로 보호되므로, 데이터의 일관성을 쉽게 유지할 수 있습니다.충돌 예방: 충돌이 발생하기 전에 미리 차단하므로, 트랜잭션이나 스레드가 안전하게 작업을 수행할 수 있습니다.간단한 구현: 비교적 단순한 구현으로 충돌을 방지할 수 있습니다.단점:성능 저하: 잠금으로 인해 다른 트랜잭션이나 스레드가 대기해야 하므로 성능 저하가 발생할 수 있습니다.교착 상태: 여러 트랜잭션이나 스레드가 서로의 잠금을 .. 2024. 7. 26. 데이터 정규화 R-DMBS대표적인 RDBMSMySQLOraclePostgreSQLMaria DBAuroraRDMBS의 가장 큰 특징으로 행열로 구성된 테이블 구조, PK와 FK, 키를 이용한 테이블 관의 관계성 맺기, SQL사용, ACID 등이 있다RDMBS를 사용하면 복잡한 데이터 구조를 효율적으로 관리하고 신뢰성 있는 데이터 사용을 보장 해 줄 수 있다데이터 구조를 효율적으로 관리하는 방법으로 데이터 정규화를 시킨다DBMS대표적인 DBMS - NoSQL DB데이터 정규화정규화(Normalization)는 관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 구조화하는 과정으로, 데이터 중복을 최소화하고 데이터의 일관성과 무결성을 유지하는 것을 목표로 합니다. 정규화는 여러 단계로 이루어지며, 각 단계는 특정한 .. 2024. 7. 15. 데드락 2024. 7. 12. 백오피스 코드 작성 전 흐름 정리 내 강의를 듣는 학생에 대한 정보 관리학생들 정보 확인하기 (개별)코스별, 혹은 전체 내 코스에 대해서 학생들 분포 파악하기(직업 분포, 나이 분포)→subscription 테이블에서 course id 를 가지고 있는 student를 List 형태로 뽑아와서 .map{StudentResponse.from(it)} 형태▼data class StudentInfoResponse( val birthYear : Int, val job : String, val SubcriptionRepository.findStudentByCourseId(courseId) : List.let{it.map {StudentResponse.from(it) } }: List→마찬가지인데 response형태만 StudentInfoRes.. 2024. 6. 13. 이전 1 2 3 4 ··· 8 다음