고가용성이란(High Availability)?
2022. 7. 5. 22:51
카테고리 없음
면접을 보는데 고가용성에 대해 질문을 받았는데 들어본 말이기만 하고 전혀 뭔지 몰랐다. 개념적인 부분이라서 간단히만 살펴보자. 시스템이 오랜 시간 동안 정상 운영이 가능한 것을 의미한다. 가용성은 시스템을 정상적으로 사용할 수 있는 가동률이다. 가동률은 정상 사용 시간 / 전체 사용 시간으로 나눈 값을 의미한다. 즉, 고가용성은 가용성이 높은 것을 의미한다. 가동률은 아래와 같은 표로 정의된다. 즉, 클러스터링과 같은 방법으로 고가용성을 높게 만들 수 있을 것 같다. 출처 위키
데드락이란?
2022. 7. 5. 21:24
기타 IT
데드락이란? 데드락이란? 두 개 이상의 프로세스가 서로 상대방의 작업이 끝나기만을 기다리는 현상이다. 예를 들어보자. 점원1과 점원2는 계산을 하려고 한다. 점원1은 캐셔를 점유했다. 점원2는 계산할 옷을 점유했다. 점원1은 옷이 필요한 상황이고, 점원2는 캐셔가 필요한 상황이다. 이 상태로는 절대로 결제가 일어날 수 없다. 이런 상황을 데드락이라고 한다. 데드락 발생 조건 데드락이 발생하기 위한 조건은 아랭 네 가지가 모두 성립되어야 한다. 상호 배제 자원은 한 번에 하나의 프로세스만이 사용할 수 있다. 점유 대기 하나의 프로세스가 자원을 점유하고 있고, 다른 프로세스가 점유하고 있는 자원에 요청하고 대기해야 한다. 비선점 다른 프로세스에 할당된 자원은 사용이 끝날 때 까지 강제로 빼았을 수 없다. 순..
CountDownLatch로 동시성 테스트 하기
2022. 5. 14. 19:34
Java
CountDownLatch란? 쓰레드가 2개 이상일 경우 일정 개수의 쓰레드가 끝난 후 다음 쓰레드가 실행될 수 있도록 대기시키고, 끝나면, 다음 쓰레드가 실행될 수 있도록 하는 것이다. 언제 사용할 수 있을까? 나는 동시성 테스트를 할 때 사용했다. 여러가지 상황에 활용할 수 있겠지만, 테스트 코드를 작성할 때를 예를 들어보겠다. 사용 해보기 테스트용 클래스 public class CountDownLatchT { int count = 1; public void call() { System.out.println("count = " + this.count++); } } countDownLatch 미사용 시 @Test void CountDownLatch() throws InterruptedException ..
Redis 동시성 이슈 개선하기
2022. 5. 14. 13:32
Spring
Redis에서 조회수 증가 동시성 이슈 조회수를 Redis에 캐싱하고 나중에 RDB로 write back해야하는 일이 있었다. Redis에서 해야하는 일은 게시물이 조회되면 → 해당 게시물의 id를 key로하여 조회수를 저장하는 일이다. 이슈 사항 먼저 조회수에 대한 상세 로직은 아래와 같다. Transaction1(T1)이 게시글 1번의 조회수를 조회한다. T1은 조회수를 1 증가한다. 조회수는 최종적으로 1증가 되어 Redis에 저장된다. 하지만 T2가 동시에 요청을 하면? 아래와 그림과 같은 이슈가 발생한다. T1과 T2가 조회수를 조회한 후 T1이 변경하고 T2가 변경했을 때 각자 조회한 조회수가 동일했기 때문에 동기화가 안되는 현상이다. 즉, 최종적으로는 조회수가 12가 되어야 하는 것이다. 이..
RedisTemplate CastClassException(직렬화, 역직렬화 이슈)
2022. 5. 12. 15:17
기타 IT
RedisTemplate 설정 시 직렬화 역직렬화 문제 RedisTemplate 설정을 하고 Redis에 저장을 해보면, byte코드로 저장이되는 현상이있다. key가 저장되는데 저렇게 저장되니 cli에서 값을 조회를 할 수가 없었다. 아주 불편한 사항이다. (아래 사진과 같이) 문제1 - 직렬화 key가 사람이 알기 어려운 문자로 저장되어 있다. 먼저 직렬화 역직렬화 인터페이스는 `RedisSerializer `이다. 알아만 놓자. Spring Data Redis는 기본 직렬화 구현체가 JdkSerializationRedisSerializer이다. 여기서 직렬화하는 내부 로직을 살펴보면, conver()가 있다. 여기를 살펴보자. JdkSerializationRedisSerializer.java Ser..
스프링 부트 Logger 사용법 및 팁
2022. 5. 11. 18:13
Spring
스프링 부트에서 로깅 사용법 스프링 부트는 spring- boot-starter-logging을 기본적으로 제공함 import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Configuration public class RedisScheduler { private final Logger logger = LoggerFactory.getLogger(this.getClass()); private void log(String name) { logger.trace("trace log={}", name); logger.debug("debug log={}", name); logger.info(" info log={}", name); logger.warn(" warn lo..
Spring Data Redis에서 O(N) 명령어인 Keys를 Scan으로 대체하기
2022. 5. 11. 15:36
기타 IT
아직 Redis에 대해서는 잘모르지만, 싱글 스레드로 동작하기 때문에 O(N)은 피해야 한다는 것을 알게 되었다. redis-cli가 아닌 Spring Data Redis의 RedisTemplate에서 어떻게 대체할 수 있는지 어떻게 대체 했는지 기록해보려고 한다. keys 명령어 → Scan 명령어로 개선하기 keys 사용할 경우 @Transactional public void updateRDB() { HashOperations hashOperations = redisTemplate.opsForHash(); Set keys = redisTemplate.keys("posts:*"); for (String key : keys) { int index = key.indexOf(":"); Long postId ..
Redis는 언제 사용해야 할까?
2022. 5. 11. 13:15
기타 IT
블로그 프로젝트의 조회수 증가를 Redis로 관리하기로 결정했다. Redis가 무엇인지 알아보고, 왜 Redis를 써야하는지와 어떻게 사용할 것인지에 대해 정리해보자. Redis 개요 Redis는 Remote Dictionary Server의 약자이다. Remote: 외부를 의미하고 Dictionary: HashMap과 같은 key - value 자료 구조 Server: 서버를 의미한다. 즉, 외부에 있는 key - value의 자료구조를 사용하는 서버이고 데이터베이스를 의미한다. 인메모리 데이터 저장소 레디스 공식 홈페이지를 보면, 이렇게 설명한다. 데이터베이스, 캐시, 스트리밍 엔진 및 메시지 브로커를 인메모리 데이터 저장소로 사용한다. 그렇다, 핵심은 인메모리이다. Cache 개념 나중의 요청에 대..