분류 전체보기
-
-
-
#1. 특정 상품에 동시 주문 요청 증가 시 DB 커넥션 부족 문제 해결 과정개발 이야기 2024. 11. 13. 23:16
[상황 설명] 선착순 구매 프로젝트에서 주문 API를 완성하고, 서버 환경에서 부하 테스트를 진행하였다.특정 상품에 100개의 주문 요청이 동시에 몰릴것을 가정한 시나리오로 테스트를 진행했는데, [실패가 많았다.] [원인 분석] 주문 API에서 재고 차감 시 해당 상품 row에 묵시적 X-Lock이 걸리며, 이는 트랜잭션이 종료될 때까지 유지된다. 외부 API와 통신하는 결제 요청은 거의 800 ~ 900ms 가까이 걸리기 때문에 하나의 주문 API 실행 시간은 평균 1s를 넘게된다. 특정 상품에 주문이 몰렸을 때 X-Lock으로 인해 순차적으로 실행되는데, 자신보다 앞선 주문 개수 x 1s의 시간을 대기하게 된다. 문제는 자원 대기 시간 제한에 있는데, Hikari Pool의 경우 connection-..
-
[Lock] X-Lock은 순서를 보장할까?(Transaction Scheduling : CATS)DB 2024. 9. 12. 09:37
[문제 시나리오 설명]선착순 구매 프로젝트를 진행하고 있다.특가 상품을 한정된 수량만 판매하기 때문에 갑작스럽게 이벤트 트래픽이 발생하는 상황을 가정한다. 가장 먼저 고민한 내용은 동시성 이슈이다. * 동시성 이슈란? 하나의 공유 자원을 여러 실행 단위가 변경함으로써 자원의 정합성이 맞지 않는 문제프로젝트에서 동시성 이슈가 발생할 수 있는 자원은 상품 재고이다.상품 구매가 일어나면, (상품 재고 확인 -> 재고가 남아 있으면 재고 차감) 의 로직을 수행하는데, 로직의 원자성을 보장하기 위해 X-Lock을 사용했다. * X-Lock에 대해 자세하게 알고 싶으면 링크를 참조해주세요. https://mergeman.tistory.com/10 동시성 이슈는 해결 되었지만, 순서도 보장 되었을까? 5명..
-
[LeetCode 75] 283. Move Zeroes카테고리 없음 2024. 9. 9. 15:49
문제링크 : https://leetcode.com/problems/move-zeroes/description/?envType=study-plan-v2&envId=leetcode-75 [접근법]0이 아닌 원소의 상대적인 순서를 유지하면서 앞쪽 인덱스로 밀어넣는 것이다.문제는 in-place. 즉, 별도의 공간을 할당하지 않고 주어진 배열 내에서만 풀어야 한다. 그리디하게 풀어보기단순하게 생각하면 루프를 돌면서 각 자신의 앞쪽 인덱스를 다시 순회하는 것이다.예를들어 주어진 배열이 아래와 같다면, 자신의 앞쪽 인덱스에서 0이 최초로 나오는 인덱스를 찾아서 현재 인덱스의 값을 넣어주는 것이다.[0,1,0,3,12][0,1,0,3,12] //idx = 0[1,0,0,3,12] //idx = 1[1,0,0,3,12..
-
[LeetCode] 616. Add Bold Tag in String알고리즘 2024. 9. 5. 10:15
문제 링크 : https://leetcode.com/problems/add-bold-tag-in-string/description/(프리미엄 문제 입니다.) [문제 설명]프리미엄 문제라 간략한 컨셉만 설명합니다.예제는 각자 만들어 보세요. 문자열 s와 문자열 dict 가 주어지면, dict의 각원소와 문자열 s의 일부와 같은 부분을 bold 처리 한다.예를들어, s = "abcxyz", dict = ["abc"] 가 주어지면 "abcxyz 가 되어야 한다.만약, bold 처리한 부분이 겹치면 bold 처리는 한 번만 해야한다.예를들어, s = "abcxyz", dict = ["abc", "xyz"] 가 주어지면 "abcxyz" 가 되어야 한다. [접근법]코드로 옮기기 전에 손으로 푼다면 어떻게 풀지 생..
-
[LeetCode 75] 1768. Merge Strings Alternately알고리즘 2024. 8. 27. 16:32
문제링크 : https://leetcode.com/problems/merge-strings-alternately/description/?envType=study-plan-v2&envId=leetcode-75 [접근법]두 개의 문자열을 번갈아 가면서 하나의 문자로 합치고(merged), 두 문자열 중 남은 문자가 있으면 merged에 모두 넣어주는 방식으로 구현할 수 있다.(두 문자열의 길이는 같을 수 있다.) 각 문자열을 가르킬 포인트 두 개를 두었고, 두 문자열 중 짧은 문자열 길이만큼 순회를 돌았다.순회가 끝나면 l, r 중 남은 길이만큼 mergeWord 에 추가해주었다.(큐를 이용할 수도 있지만, 성능상 array 접근이 더 빠를거라 판단되어 포인터를 사용했다.) 풀이 코드class Solutio..
-
[kakao]2024 겨울 인턴. 도넛과 막대 그래프알고리즘 2024. 8. 13. 17:46
더보기 이 글은 문제 풀이 시 사고 과정을 정리한 글 입니다.문제 해결 코드는 글 가장 아래 있습니다. 문제링크 : https://school.programmers.co.kr/learn/courses/30/lessons/258711 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr [접근법]카카오 공식 풀이나 블로그를 보면 노드와 간선의 특성을 발견해 그래프 유형을 판단하는 방법이 있다.하지만 실전에서 떠올리기 어려울뿐더러 가장 먼저 생각나는 것은 완전탐색이다.(bfs, dfs 모두 가능하다.)필자 역시 dfs로 접근했기 때문에 해당 사고 방식으로 풀어보겠다...