ETC

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자체에 락을 걸어야 한다. 데이터베이스에서 ..

ETC

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

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

ETC

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

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

ETC

원격 데스크톱으로 VMware 실행 시 무한 로딩 문제 해결

원격 데스크톱으로 VMware 실행 시 무한 로딩 문제 해결 – 디스플레이 설정 16비트 적용Windows 원격 데스크톱(RDP)을 통해 원격지의 PC에 접속한 뒤, 해당 PC에서 VMware를 실행할 경우 VMware 화면이 무한 로딩 상태로 멈추는 현상이 발생할 수 있음. 이는 그래픽 처리 충돌로 인해 발생하는 문제이며, 원격 데스크톱의 디스플레이 색상 설정을 16비트로 낮추는 것으로 해결 가능함. 증상원격 데스크톱 접속 후 VMware 실행 시 VMware UI가 뜨지 않거나 무한 로딩 상태 유지VMware 실행 직후 화면이 검은색 또는 흰색으로 유지됨로컬 접속 시 VMware는 정상적으로 동작함 원인원격 데스크톱 환경에서 고색상(32비트) 모드 사용 시, VMware의 가상 그래픽 드라이버와 충..

ETC

CI(Continuous Integration)/CD(Continuous Delivery & Continuous Deployment)란?

💡 CI(Continuous Integration)란? - CI(Continuous Integration)란, 지속적인 통합이라는 뜻이다. - 새로운 코드 변경 사항이 정기적으로 빌드 및 테스트되어 레포지토리에 통합하는 것을 의미한다. (빌드 및 테스트 자동화) 🔎 CI가 필요한 환경에는 어떤 조건이 있을까? 1. 다수의 개발자가 형상관리(Git, SVN) 툴을 공유하여 사용하는 환경이어야 한다. - 형상관리 툴은 기능을 추가할 때 마다 commit 등을 날려 레포지토리에 버전을 업데이트할 때 원천 소스코드의 충돌을 방어하는 역할을 한다. 2. MSA(Micro Service Architecture) 환경 - MSA에 대한 설명은 하단의 링크를 참조. https://roajava.tistory.com/2..

ETC

모놀리식 아키텍처(Monolithic Architecture) vs MSA(MicroService Architecture)

💡 모놀리식 아키텍처(Monolithic Architecture)란? - 전통적인 개발 아키텍처다. - 하나의 프로젝트에 모든 기능들이 싹 다 들어가 있다. 🔎 모놀리식 아키텍처 장점 - 중앙에 집중된 구조이기때문에 모든 기능의 처음부터 끝까지 테스트를 더 빠르게 할 수 있다. - 하나의 프로젝트에 비즈니스 로직, UI, 콘텐츠 등 모든 구성 요소가 다 들어가 있기때문에 디버깅이 편하다. - 소규모 프로젝트라면 단순하면서도 견고한 구조를 만들 수 있다. 🔎 모놀리식 아키텍처 단점 - 대규모 프로젝트라면 하나의 프로젝트가 점점 거대해져 구조를 제대로 파악하지 않으면 하나의 장애가 발생할 경우 다른 영역까지 영향을 끼칠 가능성이 높다. - 아무리 작은 부분을 수정하더라도 전체 프로젝트가 망가질 수 있다. (..

ETC

컴퓨터의 메모리 구조

💡 메모리 구조 프로그램이 실행되기 위해서는 프로그램이 메모리에 로드(load)되어야 한다. 메모리에 올라가지 않은 상태는 그저 소스 코드 덩어리일 뿐이다. 메모리가 올라간다는 것은 코드의 부분부분에 메모리가 할당되는 것이다. → 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 각각의 메모리 공간은 상호작용하며 프로그램 실행에 기여한다. 1) 코드(code) 영역: 실행할 프로그램의 코드 2) 데이터(data) 영역: 전역 변수, 정적(static) 변수 3) 스택(stack) 영역: 컴파일 타임에 크기가 결정됨 4) 힙(heap) 영역: 런타임시 크기가 결정됨(동적할당) 💡 컴파일 타임 사람이 작성한 소스코드를 컴퓨터가 해석할 수 있도록 기계어로 변환시키는 과정을 컴파일이라고 ..

로아다.
'ETC' 카테고리의 글 목록