새로운 내용을 공부할 때
새로운 내용의 공부를 시작할 때 용어의 정의를 이해하지 못하거나 정확하게 알지 못한다면 그 용어가 포함된 문장을 이해하지 못합니다.
작은 단어 하나가 내용을 이해하지 못하게 하기 때문에 용어를 정확하게 이해하는 것이 중요합니다.
동기 vs 비동기 I/O 아키텍처 병목과 메모리 스파이크
최근 비동기 프로그래밍, 멀티플렉싱, 리액티브 스트림을 학습하면서 동기 I/O 방식은 실무에서 사용하기엔 낡은 방식인가 생각이 들었습니다.
저희 회사 서비스에서도 아직 동기방식을 사용하며, 어떤 상황에서 비동기 방식을 채택할 수 있고, 비동기 방식이 오히려 유지보수를 어렵게 하는지 알아야할 필요가 있다고 생각이 들었습니다.
비동기 방식은 리소스 절약처럼 보이지만 ‘숨겨진 리소스’가 발생하게 됩니다.
동기 I/O가 유리한 환경은 언제일까
조건 | 동기 방식이 유리한 이유 |
---|---|
I/O 크기가 작음 | 응답 빠르고 메모리 부담 적음 |
요청 빈도가 적음 | 스레드 대기 부담이 없음 |
네트워크 품질이 일정 | 예외 처리가 단순함 |
비즈니스 요구 시간이 여유로움 | 순차 처리로 디버깅이 쉬움 |
일관성이 중요함 | 트랜잭션 단위로 처리하기 쉬움 |
그래서 금융 거래, 주문 시스템, 설정 변경 API 등에서는 동기 방식이 적절합니다.
동기 I/O가 불리한 환경은 언제일까
조건 | 문제가 되는 이유 |
---|---|
요청 빈도가 많음 | 스레드 수 고갈 → 503 |
대용량 파일 업로드 | 처리 시간 길어짐 → 병목 |
실시간 UX 요구 | 사용자는 대기해야 함 |
I/O 병목 발생 위치 | block 상태로 메모리, 스레드 낭비 |
예: 채팅 서비스, 이미지업로드, 검색 API 등
비동기 I/O가 유리한 환경은 언제일까
상황 | 비동기가 더 적절한 이유 |
---|---|
요청은 많지만 중요도는 낮음 | 로그, 알람 등 |
네트워크 품질은 좋음 | 빠르게 처리 후 콜백으로 후속 처리 |
서버 리소스가 제한적임 | I/O 대기 없이 바로 반환 가능 |
처리 순서를 보장할 필요 없음 | 대기 없이 빠르게 처리 가능 |
비동기 방식의 숨겨진 리스크
1) 메모리 스파이크
비동기 요청은 응답이 도착할때까지 내부적으로 콜백이나 큐에 저장한다.
응답이 한꺼번에 몰리면 GC압박, Full GC, OOM 발생 가능성 존재
2) 상태 동기화 문제
비동기 처리 중 응답 순서가 바뀌거나 공유 자원에 동시에 접근하면 RaceCondition, 정합성 오류, 순서 역전이 발생할 수 있다.
동기 방식의 병목을 아키텍처적으로 우회하는 방법
전략 | 목적 |
---|---|
커넥션 풀 제한 | 과도한 연결 방지 |
캐시 사용 | I/O 횟수 줄임 |
프록시 응답 분리 | 요청과 처리를 분리 |
큐를 통한 후속 처리 | 응답은 빠르게, 처리는 나중에 |
API Gateway 분산 | I/O 집중 구간 분리 |
비교표
기준 | 동기 | 비동기 |
---|---|---|
응답 순서 중요 | ✔️ | ❌ (보완 필요) |
실시간 UX | ❌ | ✔️ |
트랜잭션 일관성 | ✔️ | ❌ (SAGA 등 필요) |
트래픽 수용 | ❌ | ✔️ |
장애 추적 | ✔️ | ❌ (로그/모니터링 강화 필요) |
예외 처리 단순 | ✔️ | ❌ (분산 오류 처리 필요 |
댓글남기기