4. 즉시저장 → 모아서 저장 (비동기 데이터 수집)
즉시 저장 vs 모아서 저장 (비동기 처리)
- 즉시 저장은 데이터가 들어올 때마다 매번 DB에 저장하는 방식.
하지만 대량의 트래픽이 발생하면 DB 부하가 급격히 증가하고, 성능 저하 발생 가능. - 모아서 저장 (비동기 처리)는 데이터를 메모리 큐 등에 임시로 저장하고,
일정 수 이상이 모이거나 일정 시간이 지나면 한꺼번에 DB에 저장.
이를 통해 시스템 부하를 줄이고, 응답 속도를 빠르게 유지할 수 있음.
비동기 처리 예제
Bad case: 동기 처리
public class SynchronousSave {
public void saveData(Data data) {
// 요청이 들어오자마자 즉시 DB 저장
saveToDatabase(data);
System.out.println("저장 완료");
}
private void saveToDatabase(Data data) {
// DB 저장 시 시간이 오래 걸릴 수 있음
try {
Thread.sleep(100); // DB I/O 지연 시뮬레이션
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Good case: 비동기 처리, 버퍼 저장 + 일괄 처리
public class AsyncBufferedSave {
private static BlockingQueue<Data> queue = new LinkedBlockingQueue<>();
private static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
// 요청이 들어오면 큐에 적재
public void collect(Data data) {
queue.offer(data);
System.out.println("데이터 큐에 저장됨");
}
// 주기적으로 큐에 모인 데이터를 DB에 일괄 저장
public void startBatchSaver() {
scheduler.scheduleAtFixedRate(() -> {
List<Data> batch = new ArrayList<>();
queue.drainTo(batch, 100); // 최대 100개 꺼냄
if (!batch.isEmpty()) {
saveBatchToDatabase(batch);
}
}, 0, 5, TimeUnit.SECONDS);
}
private void saveBatchToDatabase(List<Data> batch) {
System.out.println("DB에 일괄 저장 중: " + batch.size() + "건");
}
}
요약 정리
- 즉시 저장은 요청마다 I/O가 발생해 고성능 환경에서 병목 발생 가능.
- 비동기 수집 + 모아서 저장은 시스템 부하를 줄이고 응답 속도를 향상.
- 큐 기반 버퍼링 방식은 데이터 유실, 동기화, 장애 처리에 대한 대비가 필요.
- 백그라운드 쓰레드, 스케줄링, 에러 로그 추적 등의 체계가 함께 설계되어야 함.
- 실시간 알림, 모니터링과 연계하면 사용자 경험과 시스템 안정성 모두 확보 가능.
'CS 정리' 카테고리의 다른 글
Java 대용량 데이터 처리 (6) - 멀티 쓰래드/병렬 처리 (0) | 2025.05.04 |
---|---|
Java 대용량 데이터 처리 (5) - 캐시 계층 활용(L1, L2, DB) (1) | 2025.05.02 |
Java 대용량 데이터 처리 (3) - 비동기 처리 (0) | 2025.04.27 |
Java wrapper class and caching, boxing & unboxing (0) | 2025.04.24 |
Java 대용량 데이터 처리 (2) - Stream 메모리 효율 높이기 (0) | 2025.04.20 |