본문 바로가기

Happyer16

(314)
부의 추월차선 보호되어 있는 글입니다.
스프린트 - (1) 스프린트 준비하기 스프린트 준비하기 스프린트를 시작하기 전에 먼저 적절한 과제를 선택하고 적임자들로 팀을 구성해야 한다. 또한 스프린트를 진행할 시간을 확보하고 장소도 구해야 한다. 1. 과제 블루보틀 CEO 제임스는 샌프란시스코 지역에서 오프라인 커피 매장이 사랑받기 시작하자, 온라인 시장으로 진출하려 하였다. 이때, 기존의 전문적인 이미지와 바리스타의 친절함을 온라인에 담고 싶어하였고, 이를 위해 팀원들이 아이디어를 내었다. 하지만, 이런 문제는 항상 주관적이고 정답이 없다. 블루보틀 팀은 어떠한 방식으로 접근했을까? 여러 가지 스케치를 정한 다음에 단순히 외양만을 구축하여 고객들의 반응을 살펴보았다 나는 어떠한 아이디어가 떠오르고 실행에 옮길 때 항상 힘들다, 오래 걸린다라는 핑계와 함께 포기하였다. 하지만 이렇게 ..
MySQL - 12장. 쿼리 종류별 잠금 12.1. InnoDB의 기본 잠금 방식 MySQL에서 사용가능한 스토리지 엔진 가운데 InnoDB를 제외한 스토리지는 테이블 잠금을 지원하기 때문에 쿼리가 사용하는 잠금이 복잡하지 않음 InnoDB에서는 쿼리별로 사용하는 잠금이 달라서 복잡함 InnoDB에서 SELECT이 어떤 잠금을 필요로 할까? REPEATABLE-READ 이하의 격리 수준에서는 아무런 잠금을 사용하지 않음 SERIALIZABLE 격리 수준에서는 기본적으로 LOCK IN SHARE MODE를 사용하기 때문에 읽기 잠금을 걸고 읽는다. 그렇기 떄문에 MySQL 서버의 성능이 떨어지게 된다. 잠그는 방법은 읽기 모드와 쓰기 모드 두가지가 있다. SELECT * FROM employees WHERE emp_no=10001 LOCK IN ..
MySQL 아키텍처 보호되어 있는 글입니다.
네이버 - 콘퍼런스 참가 기능 개발기 ( 대규모 참가 서비스 개발 ) 네이버와 같이 대규모 서비스 개발기를 감사하게 공유해주어 해당글을 보고 재 작성한 블로그입니다. https://d2.naver.com/helloworld/5048491 개발에 사용한 도구 nGrinder : 성능 테스트 도구 Pinpoint: 성능 모니터링 도구 nbase-src : Redis 기반의 분산 메모리 저장소 성능 테스트는 어떻게? 어떠한 목표로? 나처럼 대규모 서비스에 있어보지 않은 사람은 성능 테스트를 피부로 느껴보지 못한다. 그렇다면 대규모 서비스에서 성능 테스트와 목표는 어떻게 잡을까? 성능 테스트하면 모호해 보이지만 항상 정확한 수치를 기반으로 목표를 가져아 한다 몇 초안에 XX,XXX 번의 요청이 들어올 수 있다고 가정하고, 1초에 X,XXX건 요청을 처리하고 서버당 XXX TPS(..
레디스와 분산락 들어가기 전에 대규모 서비스 개발에 대한 경험이 없다면, 여러 서버를 운영하는 분산환경에서 락 처리에 관한 고민을 할 필요를 느끼지 못한다. ( 물론 내가 부족한 개발 실력을 가지고 있어서도 그렇지만... ) 많은 트래픽을 받는 경우 당연히 수평적 확장이 용이해야 하고, 여러 대의 서버로 API가 분산 호출된다. 서비스 특성 상 트랜잭션이 많이 일어나는 상황이면 동기화된 처리가 필요하고, 여러 서버에 공통된 락을 적용해야 하기 때문에 레디스를 이용하여 분산락을 이용한다. 분산 락은 데이터베이스 등 공통된 저장소를 이용하여 자원이 사용 중인지를 체크한다. 그래서 전체 서버에 동기화된 처리가 가능해진다. 간단한 분산 락 구현하기 setnx 명령어를 통해 "락이 존재하지 않는다", "존재하지 않는다면 락을 획..
JPA 에러 - Deadlock found when trying to get lock; try restarting transaction Deadlock found when trying to get lock; try restarting transaction Deadlock이 발생하게 된 코드 및 상황 @Transactional(isolation = Isolation.SERIALIZABLE) override fun save(userNo: Int, productId: Int): Order { return repository.findByProductId(productId)?.let { println("[${Thread.currentThread().id}] - $productId count is increased - ${it.count}") it.count += 1 return repository.save(it) } ?: createOrder(u..
스프링 blocking vs non-blocking : R2DBC vs JDBC & WebFlux vs Web MVC 들어가기 전 해당 글은 https://technology.amis.nl/2020/04/10/spring-blocking-vs-non-blocking-r2dbc-vs-jdbc-and-webflux-vs-web-mvc/ 를 번역한 글입니다. 영어가 더 편하시다면 이 글을.... 스프링 프레임워크 버전 5는 리액티프 프로그래밍을 위한 WebFlux를 2017년 8월에 릴리즈 하였고, 2019년 12월에 리액티프 드라이브를 사용한 관계형 데이터베이스인 R2DBC를 릴리즈하였다. 해당 포스팅에서는 WebFlux와 R2DBC를 사용했을 때 더 높은 동시성에 대해 알아본다. 이 둘을 사용하면 더 빠른 응답과 더 높은 처리량을 가지고, 뿐만 아니라 메모리도 조금 사용하고 요청당 CPU도 조금 사용한다. 그리고 JAR ..
7장. 트랜잭션 ( 데이터 중심 애플리케이션 설계 ) 보호되어 있는 글입니다.
1장. 신뢰할 수 있고 확장 가능하며 유지보수하기 쉬운 애플리케이션 [데이터중심 어플리케이션 설계] 데이터 중심 애플리케이션 설계 책을 읽게 된 계기 나는 아직 수백만명의 유저를 지닌 회사에서 일한 경험이 없다. 그렇기 때문에 수백만명의 사용자를 감당할 수 있는 데이터 시스템을 어떻게 만들어야 하는가? 애플리케이션이 고가용성을 갖추기 위해서는 어떻게 설계해야 하는가? 에 관한 지식이 없었고 이 책을 선택하게 되었다 데이터 중심 어플리케이션에서 공통으로 들어가는 요소들 데이터를 저장할 데이터베이스 읽기 속도 향상을 위한 값비싼 수행 결과를 기억하는 캐시 사용자가 키워드로 데이터를 검색하거나 다양한 방법으로 필터링할 수 있게 제공 ( 검색 색인 - search index ) 비동기 처리를 위해 다른 프로세스로 메시지 보내는 스트림 처리 ( stream processing ) 주기적으로 대량의 누적된 데이터..