본문 바로가기

CS/데이터베이스27

동시성 제어하기 - 07. 읽기와 쓰기의 트레이드 오프 병목 해소하기 쓰기 지점의 병목은 하나의 레코드를 점유 → 락 대기가 발생 락 대기를 풀고자 테이블 형식으로 분리 → 조회 지점의 병목이 발생 조회 지점의 병목은 카운트로 처리 INSERT 했던 데이터들을 aggregation해서 sum 하기 위해서 매번 카운트 쿼리가 발생 데이터의 성질 확인하기 정합성을 요구하는 데이터인가? 예시) 좋아요수가 0.1초의 딜레이를 가진다고 해서 고객에게 엄청난 손해를 주는 데이터인가? 그렇지 않다. 좋아요 수는 어느 정도의 실시간성만 보장만 된다면 괜찮다. 클라이언트는 웹 서버에 좋아요 누름에 대한 요청을 한다. 웹 서버는 좋아요 테이블에 INSERT를 한다. 조회 시점은 게시물 테이블 컬럼에 캐싱을 해놓는다. 특정 주기를 가진 스케쥴러가 좋아요 테이블을 주기적으로 co.. 2023. 6. 7.
동시성 제어하기 - 04. 낙관적 락 동시성 제어를 위한 가장 보편적인 방법은 락을 통한 줄세우기 → 비관적 락 락을 통한 동시성 제어는 불필요한 대기 상태를 만듦 MySQL에서는 인덱스를 잠그기 때문에 WHERE문 조건에 따라서 불필요한 데이터들이 잠기기도 함 동시성이 빈번하지 않은 쿼리로 인해 다른 쿼리가 대기한다면? 동시성 이슈가 빈번하지 않길 기대하고, 어플리케이션에서 제어한다. → 낙관적 락의 기본 개념 CAS(compare and set) 낙관적 락에서 어떻게 어플리케이션에서 제어하는가? → CAS를 통해 제어한다. 예제를 통해 살펴보자. 예제) 지난 예제와 다른 점은 버전이 추가되었다는 것이다. 낙관적 락에서는 레코드 하나에 대해서 버전을 매긴다. (버전 관리를 통해 내가 조회했던 버전이 맞는지 확인을 하고 맞다면 업데이트를 하.. 2023. 6. 7.
동시성 제어하기 - 02. 쓰기락과 읽기락 - 이론 동시성 제어를 위한 가장 보편적인 방법은 락을 통한 줄세우기 쓰기락과 읽기락 락을 통해 동시성을 제어할 때는, 락의 범위를 최소화 하는 것이 중요 → 락을 잡는동안 수행하는 작업의 범위를 최소화 하는 것 락의 범위가 크면 클수록 락을 획득하기 위한 여러 트랜잭션들이 대기하는 시간이 길어짐 → 그만큼 성능도 내려간다. 락의 범위가 길어질수록 Connection Pool을 점유하는 시간이 길어짐 → 최악의 경우에는 Connection Pool 고갈로 이어질 수 있음 MySQL에서는 트랜잭션의 커밋 혹은 롤백시점에 잠금이 풀림 → 트랜잭션이 곧 락의 범위 따라서 여기서는 락의 범위를 최소화 한다는 것은 하나의 트랜잭션을 최소화 한다는 것임 예시) 만약 S3이미지를 업로드 한다고 했을 때 이것이 트랜잭션 범위안.. 2023. 6. 7.
동시성 제어하기 - 01. 멀티 스레드 환경에 대한 이해 대부분 하나의 웹 서버는 여러 개의 요청을 동시에 수행할 수 있다. → 작성한 코드 한 줄은 동시에 수행 될 수 있다. → 하나의 자원을 두고 여러 개의 연산들이 경합을 하기 때문에 데이터 정합성을 깨뜨릴 수 있다. 예제를 통해 위의 상황을 이해해보자. 예제) 상황 : 100원을 출금하는 요청이 동시에 발생 첫번째 트랜잭션이 홍길동의 잔고를 읽고 출금 금액을 확인 → 잔고가 넉넉한지를 확인 → 출금금액 만큼 기존의 잔고에서 빼주어서 홍길동의 잔고를 UPDATE 첫번째 트랜잭션이 홍길동의 잔고를 읽고 출금 금액을 확인하는 과정 바로 후에 두번째 트랜잭션이 홍길동의 잔고를 읽는 상황이 발생했다고 가정 첫번째 트랜잭션은 그대로 100원을 빼고 900원을 업데이트함 두번째 트랜잭션은 잔고가 1000원으로 확인되.. 2023. 6. 7.