학습목표
- 동시성, 비동기 처리의 개념을 이해하고 구분할 수 있고, 그 예시들을 적용해본다.
목차
- 동시성 및 비동기 처리 기초 개념
- 동시성 및 비동기처리를 위한 기본 구조
들어가기 전...
- 동시성과 비동기 처리의 개념은 왜 등장하였는가?
- 시스템의 성능과 확장성을 극대화하고, 리소스를 보다 효율적으로 활용하기 위해서
- 이러한 개념이 발전해 온 배경은 ?
- CPU 성능 한계 및 멀티코어 아키텍쳐의 등장
- 과거: 단일 프로세스 기반 처리, 모든 작업이 순차적으로 처리 되었으며, 시스템 성능을 높기이 위해서는 cpu 속도를 증가시키는 방법뿐이었다.
- 문제: CPU의 클럭 속도의 물리적 한계
- 해결: 멀티코어 프로세서가 등장하여 여러개 작업을 병렬 수행이 가능해졌으며, 이를 활용하기 위해 동시성 및 비동기 처리가 필수적으로 발전하게됨
- 네트워크 및 I/O 병목 문제
- 문제: 네트워크 요청, 파일 읽기/쓰기, 데이터베이스 접근 작업은 시간이 오래걸리는 작업으로 동기적 처리방식에서는 하나의 요청이 완료시까지 다음 작업이 불가
- 해결: 비동기 처리 방식(async I/O)를 활용하면 CPU는 I/O작업을 기다리지 않고 다른 작업 수행이 가능
- ex : Node.js, Nginex, Java의 CompletableFuture 등 비동기 기술
- 대규모 트래픽 처리 요구 증가
- 현상 : 웹 어플리케이션의 성장으로 대규모 트래픽을 처리의 수요가 늘어나면서 초당 수천~수백만개의 요청을 처리하기 위한 동시성 기법이 필요
- 문제 : 기존의 방식은 하나의 요청마다 하나의 스레드를 생성하는 구조로 스레드가 많아지면 메모리 사용량 폭증
- 해결 : 이벤트 기반 비동기 처리 방식 (예: Node.js의 Event Loop, Java의 Reactive Streams) 사용.
- CPU 성능 한계 및 멀티코어 아키텍쳐의 등장
동시성(Concurency)이란?
- **동시성(Concurrency)**은 하나의 시스템에서 여러 작업(Task)을 동시에 실행하는 능력을 의미
- 실제로는 대부분의 경우 단일 코어에서 여러 작업이 분할되어 교차로 처리
- 사용자는 각 작업이 동시에 실행되는 것처럼 느낌
- 멀티스레딩을 통해 각 작업을 독립적으로 실행 가능
동시성 처리의 실제 활용: 웹 서버
- 웹 서버가 여러 클라이언트의 요청을 처리할 때, 각 요청에 대해 별도의 스레드를 생성하거나 작업을 교차적으로 처리하여 병렬성을 제공
- ex) node.js는 동시성처리를 단일 스레드로 이벤트 루프를 통해 동작한다
멀티스레딩: 동시성 구현 방법
- 멀티스레딩은 하나의 프로세스 내에서 여러 스레드를 사용하여 동시성 처리를 구현
- 각 스레드는 독립적으로 실행되며, cpu 자원을 효율적으로 사용하여 응답시간을 단축
- ex) 각 고객들이 대기시간없이 주문처리 가능
병렬성과 동시성의 차이점과 활용 방식
병렬성 (Parllelism) | 동시성 (Concurrency) |
물리적인 개념으로, 멀티코어에서 여러 작업이 동시에 처리되는 것 | 논리적인 개념으로, 싱글 코어에서 여러 스레드를 번갈아가며 빠르게 실행하여 마치 동시에 여러 작업이 수행되는 것처럼 보이도록 함 |
[Core 1] --> Task a --> Task a ---> Task a (완료) [Core 2] --> Task b --> Task b ---> Task b (완료) |
[Core 1] --> Task a --> Task b ---> Task a ---> Task b |
ex) 비디오 인코딩 작업 - 프레임을 여러코어에서 병렬로 처리하여 인코딩 속도를 빠르게 함 | ex) 네트워크요청, i/o작업등 다양한 이벤트 동시적 처리로 보이지만, 이벤트 루프를 사용하여 각 이벤트를 전환하여 처리 |
동시성 처리의 이점과 고려 사항
장점 | 단점 |
자원 효율성 : 시스템 자원을 최대한 활용하여 작업을 빠르게 처리 | 스레드 관리 문제 : 여러 스레드를 생성하고 관리하는 것은 복잡할 수 있으며, 잘못하면 교착 상태(deadlock)이나 경쟁상태 (race condition) 같은 문제 발생 |
응답성 : 여러 작업을 동시에 처리하여 대기시간을 줄이고, 사용자 경험개선에 중요한 역할 | 동기화 문제 : 스레드가 공유 자원을 동시에 접근할 때, 적절한 동기화 메커니즘이 없다면 데이터 손상 발생 |
비동기 처리(Asynchronous Processing)의 개념과 필요성
- 비동기 처리는 특정 작업이 완료될 때까지 기다리지 않고 다른 작업을 계속 진행할 수 있는 처리 방식
- 이는 작업이 완료될 때까지 대기하지 않기 때문에, 시스템은 그동안 cpu 자원을 다른 작업에 할당 가능
- 작업이 완료되면 콜백이나 이벤트를 통해 결과를 알리고, 그 결과에 대한 추가작업이 수행
비동기 처리의 실제 예시: 네트워크 요청과 UI
- 대기 시간이 오래걸리는 네트워크 요청 작업이나 I/O작업 (파일 다운로드)와 사용자 인터페이스
- 동기처리로 하면, application이 멈추거나 느려질 가능성이 크다
CompletableFuture.supplyAsync(()->{
// 긴 시간이 걸리는 작업
return "result";
}).thenApply(result -> {
// 작업 완료 후 처리
System.out.println("received "+ result);
return result;
}).exceptionally(ex-> {
// 오류 처리
System.out.println("error "+ ex.getMessage());
return null;
});
비동기 처리의 이점과 한계
장점 | 단점 |
병목 현상 완화 : 비동기 처리는 긴 시간이 소요되는 작업 (네트워크 통신, 파일 읽기 쓰기)이 진행되는 동안 시스템 자원을 더 효율적으로 사용할 수 있도록 함 | 코드 복잡성 : 비동기 처리를 사용하면 코드의 흐름이 복잡해질 수 있음 |
성능 개선 | 오류 처리의 어려움 : 비동기 작업중 발생하는 오류는 즉시 감지하기 어려움. 오류가 발생해도 작업이 계속 짆애되거나, 예외상태가 누적되기 때문 |
정리 : 동시성 및 비동기 처리 기초 개념
특징 | 병렬성 | 동시성 | 비동기성 |
주요 개념 | 물리적으로 동시에 실행 | 동시에 실행되는 것처럼 보이는 논리적 개념 | 이전 작업을 기다리지 않고 처리 |
코어 사용 | 멀티 코어 기반 | 싱글 코어 또는 멀티 코어 | 싱글 코어에서 비동기 작업 가능 |
작업 처리 | 다수의 작업을 물리적으로 동시에 처리 | 빠르게 교차하며 처리 | 작업을 위임하고 기다리지 않음 |
예시 | 멀티 코어 cpu에서 두개의 작업 병렬 실행 | 싱글 코어에서 여러스레드가 교차 처리 | 네트워크 요청 후 다른 작업 처리 |
장점 | 작업을 진정으로 동시에 처리하여 성능 극대화 | 빠른 컨텍스트 스위칭으로 효율적인 작업처리 | 대기 없이 자원을 효율적으로 사용 |
단점 | 코어 수에 따라 병렬 작업 수가 제한됨 | 컨텍스트 스위칭 오버헤드가 발생할 수 있음 | 복잡한 오류 처리, 코드 가독성 감소 |
📌 결론: 왜 동시성과 비동기 처리가 중요한가?
대규모 시스템은 더 많은 요청을 더 빠르게 처리해야 하는 요구가 증가하면서 CPU 성능 한계, 네트워크 병목, 분산 시스템 발전 등의 이유로 동시성과 비동기 처리가 필수 요소가 되었다. 이를 통해 성능을 극대화하고, 확장성을 보장하며, 비효율적인 자원 낭비를 줄일 수 있다.
참고, 구글링 및 강의
1티어 패션 커머스의 세일 도메인 프로젝트로 배우는 대규모 트래픽을 견디는 실전 백엔드의 모
실전 대용량 트래픽 처리의 모든 것! 대규모 시스템 설계부터 기능 구현, 테스트까지!
fastcampus.co.kr
'대용량 시스템 > 대규모 트래픽 이론' 카테고리의 다른 글
[대규모트래픽 이론] #2.2 비동기 메시징 시스템 이해 (0) | 2025.03.30 |
---|---|
[대규모트래픽 이론] #2.1 비동기 처리 아키텍처 이해와 확장 (0) | 2025.03.29 |
[대규모트래픽 이론] #1.2 동시성 처리와 비동기 처리의 기본 구조 (0) | 2025.03.29 |