![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/vxlQ9/btsHJBwvprB/BKcXbALRzGNl23RrjSK0IK/img.png)
안녕하세요 강정호 입니다.이번 포스팅에서는 콘서트 예약시스템을 구현하면서 고민했던 내용에 대해서 정리해보려고 합니다. [동시성 이슈에 대한 Lock 처리]콘서트 예약시스템에서 동시성 이슈가 발생하는 지점은 "좌석 임시예약" 기능에서 발생합니다.1) 좌석 테이블에 Lock이 걸리지 않은 경우Lock이 걸려있지 않으면 모든 사용자가 좌석 예약이 가능하게 됩니다. 그렇게 되면 가장 마지막에 처리한 사용자의 ID로 예약이 됩니다.이는 예약시스템에서 절대 발생하면 안되는 오류이므로 동시성을 제어할 수 있는 Lock은 반드시 필요합니다 2) Optimistic Lock(낙관적락)을 이용한 동시성 제어낙관적 락은 아래 조건에서 사용하기가 좋은데요- 여러개의 요청 중 1건만 성공시켜야 하는 경우- 충돌 빈도가 낮은 경..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/cQeJGH/btsHAm0489K/l1J4PwQu0Hu0cKxsCZPo21/img.png)
오늘은 콘서트 예약시스템의 부하테스트를 위한 테스트 시나리오에 대해서 설계해봅니다. 장애대응, 부하테스트가 중요한 이유?실제 운영환경에서 대량의 트래픽이 몰려서 서버가 다운되거나, DB Connection 부족으로 장애가 발생할 수 있습니다. 장애가 없는 완벽한 프로그램은 없기에 사전에 부하테스트를 통해서 개선점을 파악할 수 있습니다. 그리고 미리 장애대응 훈련을 하면서 실제로 장애가 발생했을 때 빠르게 조치할 수 있습니다. 부하테스트에서 반드시 확인할 것1. 예상 TPS(Transaction Per Second)2. 평균/중간/최대 응답시간(P50, P99, P999)3. 다량의 트래픽 유입시 동시성 이슈 확인위 3가지에 대해서 성능을 비교하고, 성능이 목표치에 도달하지 못하는 경우 원인을 분석하고 성..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/PGwql/btsHnrP9izn/FJj73GyeiP9q9AHQrE8Fkk/img.png)
[9주차 과제]내가 개발한 기능의 트랜잭션 범위에 대해 이해하고, 서비스의 규모가 확장된다면 서비스들을 어떻게 분리하고 그 분리에 따른 트랜잭션 처리의 한계와 해결방안에 대한 서비스설계 문서 작성실시간 주문, 좌석예약 정보를 데이터 플랫폼에 전달하는 요구사항을 기존 로직으로 구현했을때 발생하는 문제와 해결방안에 대한 문서 작성 [트랜잭션 분리의 중요성]서버 어플리케이션에서 트랜잭션의 범위를 어떻게 잡는지에 따라서 성능에 영향을 줄 수 있다.문제상황 1번 : 1개의 트랜잭션에 너무 많은 작업이 있거나, 조회가 Slow Read 쿼리가 포함되어 있는 경우트랜잭션 내에서 테이블의 데이터에 Lock을 잡은 상황이라면 다른 사용자는 트랜잭션이 모두 끝날 때까지 대기해야 하는 문제Slow Read 하는 쿼리가 있는..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/m9acF/btsIblg5gZc/Uxh7KIavzwSLDljUNzYWV0/img.png)
안녕하세요 강정호입니다. 이번 포스팅은 제가 콘서트 예약시스템에서 구현한 대기열에 대한 설계에 대해서 작성해보겠습니다. [대기열이란?]대기열은 서버에 대용량 트래픽이 몰릴 때를 대비해서 서버의 부하를 일정 수준으로 유지하기 위해 만듭니다.1000명이 동시에 좌석 예약을 하기 위해 요청을 보냈을 때, 선착순 50명만 예약이 가능하도록 하고 나머지 사용자는 대기열에 들어가게 됩니다. 이렇게 되면 서버의 부하를 줄여서 트래픽을 제어할 수 있다는 장점이 있습니다. 대기열에 있는 사용자의 요청은 일정 시간이 지나면 예약이 가능한 상태로 변경되어 고객들은 콘서트 예매를 할 수 있습니다. 이렇게 하여 단시간에 서버에 발생하는 부하를 줄여서 안정적으로 서버를 유지할 수 있습니다. [대기열 구현 방법]제가 생각한 대기열..
오늘은 트러블 슈팅에 대해서 포스팅 하려고 합니다. [문제 상황]비관적 락을 사용해서 좌석 예약시 동시성 제어를 할 수 있도록 프로그램을 개발했습니다.그러나 5개명의 사용자가 1개의 좌석 예약을 했을 때, 5명 모두 좌석 예약에 성공하는 현상이 발생했습니다. 이론상 1개의 좌석이 먼저 선점되어 예약이 되면 나머지 4명은 좌석 예약 불가해야 합니다. [문제가 발생한 코드] /** 좌석 예약 */ @Transactional public ReservationResponse reserve(ReservationRequest request) { // 1. 사용자를 조회한다. User user = userManager.findUserById(request.getUserId()); if(user ..
Chapter 2 : 비밀에 접근하는 법pg 52 : 감정은 우리의 주파수를 알려주는 회로다기분이 좋으면 => 우주가 "당신은 기분이 좋다"기분이 나쁘면 => 우주는 "중지!! 당신은 지금 나쁜생각을 하고 있어!"생각을 바꿔서 좋은 일을 생각하라. pg 53당신은 "생각하는 것" 보다는 "느끼는 것"을 받게 된다.사람들은 감정만 바꾸면 하루 전체를, 심지어 인생까지도 바꿀 수 있다는 사실을 전혀 모른다.기분이 좋아야 좋은 상황과 사람들을 끌어당기게 된다. pg 55 뭔가 당신에게 갔다면 당시이 끌어당겼다는 뜻이다. 지속적인 생각으로 끌어당겼다는 의미다. pg 58사랑은 가장 높은 주파수에 있다. 더 큰 사랑을 느끼고 내보낼수록 더 큰 힘을 얻게 된다. pg 61자신이 무엇을 생각하는지 알려면 자신의 감정..
콘서트 예약시스템에서 사용하는 쿼리 중에서 인덱스로 성능을 개선할 수 있는 부분에 대해서 알아보자. [콘서트 예약시스템에서 성능개선의 여지가 있는 쿼리] 특정일자에 대한 예약 가능한 좌석리스트 조회@Query("SELECT s FROM Seat s WHERE s.seatNo = ?1 AND s.concert.concertId = ?2 AND s.concertSchedule.concertDate = ?3") public Seat findSeatBySeatNoAndConcert(Long seatNo, Long concertId, LocalDate concertDate); 위 쿼리를 보면 Seat 번호를 조회하기 위해서 Concert, ConcertSchedule 테이블과 조인을 한다.만약에 좌석갯수가 3만..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/brx4w5/btsHbpLHZ33/GhT2bKinsx7MYD54A1JUxk/img.png)
대용량 트래픽 처리 서버를 구축할 때 동시성을 제어하는 것은 매우 중요하다.왜냐하면 대량의 트래픽이 몰릴 때 데이터의 정합성을 유지하는 것이 필수적인 요소이기 때문이다. 내가 직접 개발하면서 경험한 동시성 제어 프로그래밍에 대해서 작성해본다. [동시성 제어 프로그래밍 방식]동시성 제어 프로그래밍은 트랜잭션, 트래픽, 분산 환경 여부 등에 따라 다르게 채택하여 사용할 수 있다.콘서트 예약시스템에서 동시성 이슈가 발생하는 지점은 아래 2가지이다.1) 좌석 예약2) 포인트 충전, 사용 좌석 예약 기능 동시성 제어 프로그래밍1. synchornized - 부적합Java에서 제공하는 가장 기본적인 동시성 제어 프로그래밍 방법이다.좌석 예약 메서드에 synchronized를 걸면 싱글 스레드 방식으로 좌석 예약을 ..
- Total
- Today
- Yesterday
- Use case
- 관계대수
- Inception
- 항해솔직후기
- Spring boot
- ```````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````
- github
- pop_back
- 항해플러스후기
- 항해플러스백엔드
- docker
- resize
- 인셉션
- 도커
- 파라메터
- 열반스쿨기초반
- 재테크공부
- 내년은 빡세게!!
- 폭포수
- 유즈케이스
- 깃
- 부동산공부
- GIT
- push_back
- front
- 2023년
- 깃허브
- 월급쟁이부자들
- 월부닷컴
- 개발자 회고
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |