https://golf-dev.tistory.com/75 동시 접속자가 많은 서비스에서 조회 기능 TPS 개선하기 흔히 요즘 DAU가 많은 서비스들을 흔하게 볼 수 있습니다. 카카오의 실시간 댓글 서비스는 DAU가 60만에 도달하기도 합니다. 그럼 DAU가 뭘까요? Daily Active User의 앞 글자만 따온 용어로 하루 활성화 golf-dev.tistory.com 무엇이 문제인가? Redis는 10만 TPS의 처리량을 보여주기 때문에 DB write 작업에 한번에 많은 트래픽이 몰릴 수 있습니다. 그리고 이러한 요청이 밀려 들어오면 장애로 이어지기 때문에 꽤나 중요한 문제일 수 있습니다. 또한 JPA를 사용하는 경우 자체적으로 Blocking Call을 하기 때문에 병목이 생길 수 있습니다. 그렇..
이번 포스팅은 인프런 강의를 보고 작성한 포스팅입니다. https://www.inflearn.com/course/%EC%84%A0%EC%B0%A9%EC%88%9C-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EC%8B%A4%EC%8A%B5/dashboard 실습으로 배우는 선착순 이벤트 시스템 - 인프런 | 강의 선착순 이벤트 시스템을 구현할 때 어떤 문제가 발생할 수 있고 어떻게 해결할 수 있는지 배워봅니다., - 강의 소개 | 인프런 www.inflearn.com 쿠폰 서비스 개발하기 100개의 쿠폰을 선착순으로 개발할 예정이고 1000명이 해당 쿠폰을 사려고 대기하고 있습니다. 다음 상황을 구현해봅시다. @Entity class Coupon(..
흔히 요즘 DAU가 많은 서비스들을 흔하게 볼 수 있습니다. 카카오의 실시간 댓글 서비스는 DAU가 60만에 도달하기도 합니다. 그럼 DAU가 뭘까요? Daily Active User의 앞 글자만 따온 용어로 하루 활성화된 유저 수를 뜻합니다. 이러한 서비스는 TPS가 절대적으로 중요할 수 밖에 없는데 예를 들어 60만의 사용자중 1/60 인 1만명이 댓글 새로고침을 눌렀을 때 만약 분산 서버환경 sacle 서버 5대가 있어도 하나의 WAS당 2000개의 요청을 받아야합니다. 만약 여기서 병목이 생긴다면 굉장히 치명적일 것입니다. 문제 상황 다음 문제는 이렇습니다. 게시판 서비스이고 현재 상태 단일 서버 Tomcat 기본 thread pool size인 200개로 open했습니다. 그리고 현재 MySQL..
https://golf-dev.tistory.com/53 Redis INCR을 이용한 분산환경에서의 동시성 제어하기 문제 상황 회사에서 분산환경에서 하루에 한 번만 요청이 가능한 기능이었지만 한 사람이 3번 이상 요청을 보낸 기록이 있어 원인을 찾아보았습니다. 우선 샘플 코드는 다음과 같습니다. fun save( golf-dev.tistory.com 위 글을 보면 Redis의 INCR (increment)은 분산환경에서도 연산의 원자성을 지켜주기 때문에 이 성질을 이용하여 분산환경에서 동시요청에 대한 count를 한 후 일정 count 이상의 요청이 들어오면 해당 요청을 discard 시킬 수 있었습니다. 그렇다면 별 다른 로직 없이 분산환경에서 Redis로 동시성을 제어할 수 있었던 이유는 무엇일까요?..
자세한 건 Github를 참고해주시기 바랍니다. 배경 개인 프로젝트를 진행하면서 redis를 인증번호 저장을 목적으로 개발을 하고 테스트 하던 과정에서 저장이 되더라도 get을 하지 않는 이슈가 발생하였습니다. 이를 트러블 슈팅하기 위해서 포스팅을 하게 되었습니다. 원인 @Transactional fun authorizePhoneNumber(phoneNumber: String, authNumber: Int): Boolean { val secureNumber = authNumberRepository.findByIdOrNull(phoneNumber.substring(4)) ?: throw SecureNumberNotFoundException(phoneNumber) return secureNumber.toIn..
이제 서비스를 구현해볼 차례다. 먼저 서비스는 애플리케이션 레이어에 해당하는데 보통 비즈니스를 구현하는 구현부라고 생각하면 된다. 물론 이미 여러분들은 틀이 완성 되어있을 것이다. 컨트롤러를 먼저 만들었기 때문에 없는 클래스들은 alt + enter(mac. option + enter)를 이용하면 쉽게 틀을 만들 수 있다. 또한 ReadService와 Service가 따로 구현이 되어있는데 Transactional을 공통으로 사용할 수 있어 간결하게 코딩이 가능하며 나중에 Read와 Write 도메인이 분리되더라도 영향도를 줄일 수 있고 분리된 서비스를 기반으로 빠르게 리팩토링이 가능할 수 있습니다. @Service @Slf4j @RequiredArgsConstructor @Transactional pu..
Redis를 사용하던 와중 특정 오류가 잡혀 골치 아픈 적이 있었다. public class CacheConfig { private final RedisConnectionFactory redisConnectionFactory; @Bean public CacheManager cacheManager() { RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) .serializeValuesWith(Redi..
- Total
- Today
- Yesterday
- 백엔드
- thread
- 인터뷰
- 면접준비
- 코드
- 개발
- 코딩
- 동시성
- 면접
- Kotlin
- Spring
- 취준
- IT
- 취업
- 프로젝트
- 프로그래밍
- 자바
- DB
- 개발자
- java
- docker
- Redis
- JPA
- swarm
- 취업준비
- 게시판
- DevOps
- MySQL
- 면접 준비
- CS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |