분류 전체보기

ETC

대용량 트래픽과 동시성 제어 4편 - 레디스(Redis)를 활용한 분산 락(Distributed Lock)

지난 3편에서는 분산 환경에서 동시성 이슈를 해결하는 방법에 대해 알아보았다. 하지만, 수십만 명의 트래픽이 몰리는 경우에는 DB에 직접 락을 걸거나 끊임없이 재시도 요청을 하는 등의 방식은 DB에 엄청난 부하를 준다. 만약 디스크 기반의 DB가 뻗게되면 시스템 전체가 마비가 오는 경우로 이어질 수 있다. 이러한 병목 현상을 해결하기 위해 메모리 기반의 데이터 저장소인 레디스(Redis)를 활용하여 분산 환경에서 동시성을 제어하는 방법을 알아보고자 한다. 분산 락(Distributed Lock)이란?분산 락은 여러대의 서버가 공통으로 바라보는 별도의 외부 저장소(= Redis)에 자물쇠를 하나 만들어 두고 모든 서버가 그 자물쇠를 획득하기 위해 경쟁하는 방식이라고 보면된다. DB 앞단에 레디스라는 아주..

ETC

대용량 트래픽과 동시성 제어 3편 - 데이터베이스(DB) 락(비관적 락과 낙관적 락)

지난 2편(https://roajava.tistory.com/269)에서 자바 내에서 제공하는synchronized 키워드와 스핀 락(AtomicBoolean 변수)을 이용해 직접 구현하여 동시성 문제를 해결했었다. 하지만, 이 방법들은 실제 운영 중인 대규모 서비스 환경에서는 한계가 있다. 애플리케이션 레벨의 락은 JVM 단위 안에서만 유효하기 때문이다. 대규모 서비스는 트래픽을 감당하기 위해 여러 대의 서버를 띄우는 스케일 아웃 구조를 가진다. 서버가 3대라면, 각 서버마다 락을 따로 관리하게 되므로 여전히 DB에 있는 동일한 자원에 접근하여 동시성 이슈가 발생한다. 이러한 분산 서비스 환경에서는 동시성을 제어하려면 모든 서버가 공통적으로 바라보고 있는 DB자체에 락을 걸어야 한다. 데이터베이스에서 ..

취준일기

백엔드 개발자 경력(3년차) 면접 질문 및 코테 후기

백엔드 직군 면접에 대한 질문들을 하나씩 나열할 예정이다.리마인드겸 도움이 되시길 바라며 하나씩 채워 갈듯...ㅎㅎ 경력직 필수질문1. 이전 직장 퇴사 사유2. 직전 연봉과 희망 연봉 강소기업 D 회사 1차 면접(1:3 면접, 3명 모두 실무자)1. 간단한 자기소개2. 프로젝트 경험 당시에 온프레미스를 SaaS기반으로 전환할때 어떠한 기술들을 도입하고 설계했는지?3. 거기에서 DB 성능을 위해 어떠한 노력을 해보았는지?4. PKI 기반으로 인증 솔루션을 만들었다고 했는데 직접 구현해본 경험이 있는지?5. 공기업에 솔루션을 납품하셨다고 했는데 공기업은 폐쇄망이라 원격 작업도 어려워 직접 방문하여 설치하거나 트러블 슈팅을 진행해야할텐데 그때마다 어떻게 효율적으로 처리했는지?6. 신입 사원 온보딩을 하셨다..

ETC

대용량 트래픽과 동시성 제어 2편 - 애플리케이션 레벨의 락과 스핀 락(Spin Lock)

지난 1편에서는 여러 쓰레드가 동시에 하나의 자원에 접근할 때 발생하는 경쟁 상태(Race Condition)와 임계 구역에 대해 알아보았다.연산 3단계(읽기, 수정, 쓰기)로 나뉘어 실행되면서 다른 쓰레드의 연산을 덮어쓰는 문제가 발생했었다. 이번 글에서는 자바 애플리케이션 내부에서 이 문제를 어떻게 해결할 수 있는지 알아보고자 한다. 자바의 기본 동시성 제어, Synchronized가장 단순하고 널리 알려진 해결책은 자바가 언어 차원에서 제공하는 synchronized 키워드를 사용하는 것이다.이 키워드를 메서드에 붙이면, 해당 메서드는 한 번에 단 하나의 쓰레드만 실행할 수 있도록 보장한다. public class StockService { private int stock = 100; ..

ETC

대용량 트래픽과 동시성 제어 1편 - 다수의 사용자가 동시에 요청할 때 발생하는 문제에 대해

대용량 트래픽 상황에서 발생하는 동시성 제어 문제에 대해 이야기를 해보려고 한다. 선착순 이벤트나 티켓 판매 사이트 등 순간적으로 트래픽이 몰리면 데이터가 꼬이는 상황이 발생한다. 이러한 문제가 왜 발생하는지, 근본적인 원인에 대해 구체적인 코드와 함께 알아보고자 한다. 동시성과 동시성 제어란 무엇인가? 동시성(Concurrency)이란?동시성은 여러 작업이 마치 동시에 실행되는 것처럼 겹쳐서 일어나는 상태를 뜻한다. 우리가 만드는 웹 서비스에서는 여러 명의 사용자가 같은 시간에 서버로 요청을 보내는 상황이 동시성 환경이라고 한다. 사용자 입장에서는 각자 자신의 요청이 즉시 처리되는 것처럼 느끼지만, 서버 내부에는 수많은 쓰레드가 자원을 나누어 쓰며 쉴 새 없이 번갈아가며 실행되고 있다. 동시성 제어가 ..

Coding Test/알고리즘

그리디(Greedy, 탐욕) 알고리즘

1. 그리디(탐욕) 알고리즘이란?결정을 내려야 할 때마다 지금 당장 최선인 선택지가 전체 선택지 중 최선의 선택지라고 가정하는 알고리즘이다.나중의 결과는 고려하지 않고, 오로지 현재 시점에서의 지역적인 최적해를 찾아가는 것이 특징. 2. 그리디 알고리즘의 핵심 이론해 선택: 현재 상태에서 가장 최선이라고 생각되는 해를 선택한다.적절성 검사: 현재 선택한 해가 전체 문제의 제약 조건에서 벗어나지 않는지 검사한다.해 검사: 현재까지 선택한 해 집합이 전체 문제를 해결할 수 있는지 검사한다. 그렇지 않다면 1번으로 돌아간다. 3. 대표적인 예시동전 거스름돈 문제: 동전 개수를 최소한으로하여 거스름돈을 주는 문제.예를 들어, 1260원을 거슬러 줘야 하고 동전 단위가 500원, 100원, 50원, 10원이라면..

Coding Test/알고리즘

투 포인터(Two Pointers)

1. 투 포인터(Two Pointers)란?말 그대로 두 개의 포인터(인덱스)를 사용하여 배열이나 리스트를 효과적으로 탐색하는 기법이다.O(N)의 시간 복잡도를 가짐 2. 주요 유형 2.1. 시작점과 끝점에서 만나는 방식(양끝 조합)주로 정렬된 배열에서 두 수의 합이 특정 K와 일치하는지 찾을 때 사용된다.Pointer 1 (Left): 배열의 시작점에서 오른쪽으로 이동한다.Pointer 2 (Right): 배열의 시작점에서 왼쪽으로 이동한다.동작: 포인터에 위치한 두 요소의 합이 K보다 작으면 Left++, 크면 Right-- 를 수행하며 포인터를 이동한다. 2.2. 같은 방향으로 진행하는 방식(슬라이딩 윈도우)연속된 부분 수열의 합이 특정 값 K를 만족하는지 찾을 때 사용된다. 배열의 정렬이 필요하지..

Coding Test/알고리즘

백트래킹(Back Tracking)

1. 백트래킹이란?이전까지의 DFS (참고: https://roajava.tistory.com/262)지나가는 길에 표시를 한다. (visited = true)막다른 길을 만나서 되돌아 올 때, 그 표시를 지우지 않는다.결과 : 한 번 지나간 곳은 영원히 다시 못감 백트래킹(Back Tracking)지나가는 길에 표시를 한다. (visited = true)막다른 길을 만나서 되돌아 올 때, 표시한 흔적을 지운다. (visited = false)결과 : 한 번 지나갔던 곳이라도 나왔다면 다시 방문할 수 있음.백트래킹은 DFS + 취소(Undo) 기능이다. 2. 코드 차이DFS의 핵심 로직 예시void dfs(int x, int y) { visited[x][y] = true; // 1. 방문 도장 쾅..

로아다.
'분류 전체보기' 카테고리의 글 목록