랄라

대규모 시스템 중요 개념 정리(1) 본문

내일배움캠프/공부정리

대규모 시스템 중요 개념 정리(1)

devdaeun 2025. 3. 10. 23:48

대규모 시스템 설계시 중요한 요소 

- 사용자가 얼마나 많이 접속하는지

- 시스템이 얼마나 많은 요청을 처리할 수 있는지


동시 접속자와 초당 요청량

사용자 수

시스템을 사용하는 사용자의 수를 파악하는것이 중요하다.

제일 중요한것은 동시 접속자의 요청 수,  접속자 수의 최대 피크가 얼마나 되는지를 파악해야한다.

 

TPS(Transactions Per Second)

초당 처리되는 트랜젝션의 수, 시스템이 얼마나 많은 요청을 동시에 처리할 수 있는지를 나타내고

요청량을 모니터링하여 처리능력을 확인할 수 있다. 대규모 시스템에서 중요한 역할을 함.

 

예상지못한 이벤트로 설계된 최대치 이상의 요청이 몰릴경우 시스템이 중단될 가능성이 있으며,

이를 해결하기위한 방안을 고려해야한다. (애플리케이션 수 늘리기, 대기열 설정 등)


요청 종류에 따른 개발

애플리케이션 내부에 존재하는 각각의 시스템이 어떤기능을 수행하는지 파악하는것도 중요.

각각의 기능에따라 개발을 최적화하여 진행한다면 처리속도가 빨라져 빠른응답이 가능해지고, 보다 많은 사용자를 수용할 수 있게됩니다.

DB에서 직접적으로 데이터를 조회하거나 쓰는 곳에서 많은시간이 소모됩니다.


읽기요청 최적화

1. 캐시 사용

DB에 직접적으로 정보를 요청하는것은 시간이 많이 소요되어 이를 최소화하기위한 방법

요청이 들어왔을 때, 캐시에 정보가 있는지 우선적으로 확인한 뒤,

있는경우 -> 캐시에 저장되어있는 데이터를 바로 반환

없는경우 -> DB에서 정보을 받아와 캐시에 데이터를 저장하면서 값을 반환

 

2. 데이터베이스사용 최적화

 

- 데이터베이스 인덱싱

DB에 인덱싱을 추가하여 조회성능을 향상하여 접근하는 방법, 빠른 데이터 검색이 가능해진다.

 

- 데이터베이스 샤딩

DB를 여러 샤드로 분할하여 각각의 샤드가 독립적으로 쿼리를 처리.

 

- 읽기 전용 데이터베이스

주로 읽기요청을 처리하는 DB 인스턴스, 데이터를 주기적으로 동기화하여 최신상태 유지(동기화 문제가 발생할 수 있다.)

메인 DB에 대한 읽기 부하를 줄이고 성능 최적화

 

- 쿼리 최적화

SQL 쿼리를 효율적으로 작성하여 DB의 읽기 성능을 향상시키고, 불필요한 조인을 제거하거나 필요한 컬럼만 조회하는 방식으로 최적화를 구현. 또한, 쿼리를 분석하여 성능 병목 지점을 찾아내고 이를 개선.

 


쓰기요청 최적화

1. 비동기 처리

쓰기요청을 비동기방식으로 처리하는 방법. 백그라운드에서 로직을 처리한 뒤, 사용자에게 빠르게 응답을 반환한다.

실제적인 DB 갱신은 출력된 메시지를 큐 등에 넣어 이후에 진행.

 

* 비동기 처리 시 데이터 소실이나 오류를 방지하기 위해 적절한 검증을 수행하고, 데이터를 지속적으로 모니터링하여 실패한 요청을 재시도할 수 있는 메커니즘을 마련해야 합니다 / 데이터 순서 보장 및 고유 식별자 사용 필수

 

2. 배치 처리

실시간으로 처리하지않아도되는 요청의경우 한번에 모아서 처리하는 방법.

 

3. 분산 DB

단일 DB로 모든 요청을 처리하기힘든경우에 사용되는 방법.

데이터를 여러곳에 분산시켜 저장함으로서 DB의 부하를 줄일 수 있다.

샤딩 기법을 통해 DB를 수평으로 분할하여 각 샤드가 독립적으로 쓰기작업을 처리하도록 할 수 있다.


데이터 일관성 유지

분산 트랜잭션 (Distributed Transaction)

동시에 여러곳에서 진행되는 트랜잭션을 관리하는 방법.

모든 트랜잭션이 성공하거나, 모든 트랜잭션이 실패하는 경우만이 존재하며 이를통해 데이터의 일관성을 유지.

MSA같이 각각의 서비스를 독립적으로 운영하는 경우에 많이 사용됨.

 

*ACID

더보기
  • 원자성 (Atomicity): 트랜잭션은 전부 성공하거나 전부 실패하여, 부분적인 작업 수행이 없는 것을 보장합니다.
  • 일관성 (Consistency): 트랜잭션이 완료된 후에도 데이터베이스는 모든 무결성 제약 조건을 유지합니다.
  • 격리성 (Isolation): 동시에 실행되는 트랜잭션이 서로 간섭하지 않도록 보장합니다.
  • 지속성 (Durability): 트랜잭션이 성공적으로 완료된 후의 결과는 시스템 장애가 발생해도 영구적으로 유지됩니다.

1. 2PC (Two-Phase Commit)

분산 트랜잭션을 관리하는 프로토콜, 준비단계와 커밋단계로 나누어 처리

준비 (Prepare Phase) : 트랜잭션 준비상태 확인, 준비완료를 마스터 노드에 전달 

커밋 (Commit Phase) : 마스터 노드가 모든 트랜젝션의 준비완료를 확인한뒤, 커밋하도록 명령. 준비완료되지않은 트랜잭션이 존재할경우 트랜잭션 롤백.

 

2. 사가패턴 (Saga Pattern)

트랜잭션을 여러 단계로 나누어서 처리하며, 각 단계를 독립적으로 커밋한다. 실패시 보상 트랜잭션 실행, 롤백진행

 

3. 이벤트 소싱 (Event Sourcing)

상태변화를 이벤트로 기록, 해당 이벤트를 재생하여 상태를 유지하여 분산트랜젝션의 일관성이 보장된다.

전통적인 데이터 저장 방식과 달리, 이벤트 소싱에서는 데이터 변경 자체가 아닌 변경 이벤트를 저장


이벤트 소싱

 

*주요개념

더보기

이벤트(Event)

데이터의 상태 변화를 나타내는 기록입니다. 예를 들어, "주문 생성", "결제 완료", "주문 취소" 등이 이벤트가 될 수 있습니다.

 

이벤트 스토어(Event Store)

이벤트를 저장하는 저장소입니다. 전통적인 데이터베이스 대신 이벤트를 순서대로 저장하는 스토리지입니다. 이는 이벤트의 불변성과 순차성을 보장합니다.

 

애그리게이트(Aggregate)

관련된 이벤트를 모아 현재 상태를 재현할 수 있는 엔터티입니다. 애그리게이트는 도메인 모델의 일부분으로, 이벤트를 적용하여 상태를 변화시킵니다.

 

커맨드(Command)

애그리게이트에 특정 동작을 지시하는 명령입니다. 커맨드는 이벤트를 생성하는 트리거 역할을 합니다.

 

프로젝션(Projection)

이벤트를 읽기 모델로 변환하여 조회 성능을 최적화하는 방식입니다. 이벤트를 기반으로 읽기 전용 데이터베이스를 업데이트합니다.


CQRS

명령과 조회의 책임을 분리하는 소프트웨어 디자인 패턴.

읽기와 쓰기 작업을 분리하여 각 작업에 최적화된 구조를 사용하여 시스템의 성능,유지보수성 등을 향상.

 

*주요개념

더보기

명령(Command)

데이터를 변경하는 작업입니다. 예를 들어, 주문 생성, 결제 처리, 계정 업데이트 등이 명령에 해당합니다. 명령은 데이터베이스에 대한 쓰기 작업을 수행합니다.

명령 모델은 데이터의 상태 변경을 담당합니다. 이는 복잡한 비즈니스 로직을 포함할 수 있으며, 데이터 무결성을 보장하기 위해 트랜잭션을 사용합니다.

 

조회(Query)

데이터를 조회하는 작업입니다. 예를 들어, 주문 내역 조회, 계정 정보 조회 등이 조회에 해당합니다. 조회는 데이터베이스에 대한 읽기 작업을 수행합니다.

조회 모델은 읽기 전용 데이터베이스 또는 캐시를 사용하여 빠른 응답을 제공합니다. 이는 단순한 데이터 조회를 위한 최적화된 구조를 가질 수 있습니다.

 

'내일배움캠프 > 공부정리' 카테고리의 다른 글

Docker 란?  (0) 2025.03.04
JPA Entity  (1) 2025.02.11
RestTemplate  (0) 2025.02.11
Spring Cloud  (1) 2025.02.07
MSA와 MA의 정의  (0) 2025.02.07