[Spring] Spring batch의 청크 기반 처리는 어떠한 장점이 있을까?

조시현·2024년 7월 8일
0

SpringBatch(Scheduler)

목록 보기
4/4
post-thumbnail

청크 기반 처리란? 🔍

청크 기반 처리는 대규모 데이터세트를 청크라고 하는 더 작고 관리 가능한 조각으로 나누어서 작업하는 방식입니다.

  • 각 청크는 독립적으로 처리되므로 시스템은 과도한 메모리를 소비하지 않고 대량의 데이터를 처리할 수 있습니다.

청크 기반 처리 작동 방식 ⚙️

처리할 데이터 레코드가 100만 개 있는 시나리오를 고려해 보겠습니다.
1백만 개의 레코드를 모두 메모리에 한 번에 로드하는 대신 청크 기반 처리 방식 데이터를 1,000개 레코드 단위로 처리합니다.

  1. 청크 읽기:
    전체 데이터 세트를 메모리에 로드하는 대신 시스템은 소스(데이터베이스, 파일 등)에서 작은 데이터 청크(1000개 레코드)를 메모리를 통해 로드하고 읽습니다.

  2. 청크 처리:
    시스템은 현재 청크의 레코드를 처리합니다. 처리에는 데이터 변환, 계산, 검증 등이 포함될 수 있습니다.

  3. 처리된 청크 쓰기:
    처리 후 시스템은 처리된 데이터를 대상(다른 데이터베이스, 파일 등)에 씁니다.

  4. 완료될 때까지 반복:
    100만 개의 레코드가 모두 처리될 때까지 다음 1000개의 레코드 청크에 대해 읽기-처리-쓰기 주기를 반복합니다.

🌠 청크 기반 처리의 장점

  • 메모리 부하 감소:
    예를 들어, 100만 개의 레코드를 1000개의 청크로 처리하면 1000개의 청크가 순차적으로 처리되므로 최대 메모리 부하가 크게 줄어듭니다.
    일반적으로 1000개 레코드에 필요한 메모리와 약간의 오버헤드만 있으면 됩니다.
  • 리소스 부담 감소:
    메모리와 CPU 사용량이 합리적인 한도 내에서 유지되므로 시스템은 사용 가능한 리소스를 효율적으로 사용할 수 있습니다.
    이는 메모리 부족 오류를 방지하고 시스템의 응답성을 유지하는 데 도움이 됩니다.

  • 효율적인 자원 사용:
    모든 레코드를 한 번에 로드하면 X만큼의 메모리가 사용됩니다.
    1000개의 레코드 청크로 처리하면 특정 시간에 메모리 사용량이 약 X/1000으로 줄어듭니다(일부 오버헤드도 포함).
    이로 인해 전체 데이터를 한 번에 로드하는 것에 비해 메모리 사용량이 약 99.9% 줄어듭니다.

  • 더 나은 처리량:
    시스템은 전체 데이터 세트가 메모리에 로드될 때까지 기다리지 않고 더 작은 데이터 청크를 지속적으로 처리하기 때문에 더 나은 처리량을 달성할 수 있습니다.

청크 기반 처리가 없는 경우청크 기반 처리가 포함된 경우
메모리 사용량100만 개의 레코드를 한 번에 메모리에 로드한 번에 1,000개의 레코드만 메모리에 로드
리소스 부담높은 메모리 사용량이 시스템 리소스에 부담을 줌줄어든 메모리 사용량이 시스템 리소스에 대한 부담을 줄임
위험오류가 발생하면 전체 프로세스를 다시 시작해야 함오류가 발생하면 해당 청크만 영향을 받아, 시스템이 청크를 재처리하거나 오류를 기록하고 계속 진행할 수 있음
효율성전체 데이터 세트를 처리하는 데 비효율적일 수 있음작은 청크를 처리하여 심각한 성능 저하 없이 다른 프로세스를 동시에 실행할 수 있음.
확장성메모리 제한으로 대규모 데이터 세트 처리에 한계가 있음메모리를 비례적으로 증가시키지 않고 더 큰 데이터 세트를 처리할 수 있음
처리량전체 데이터 세트를 메모리에 로드할 때까지 대기해야 함작은 청크를 지속적으로 처리하여 더 나은 처리량을 달성할 수 있음
내결함성오류 발생 시 전체 작업을 다시 시작해야 함오류 발생 시 특정 청크만 다시 처리하거나 건너뛰어 전체 작업 중단을 방지

청크 기반 처리의 자세한 장점

1. 처리량 향상 📈

청크 기반 처리는 각 개별 항목의 트랜잭션 관리와 관련된 오버헤드를 줄입니다. 단일 트랜잭션 내에서 여러 항목을 처리함으로써 시스템은 보다 효율적으로 수행되고 더 높은 처리량을 달성할 수 있습니다.

트랜잭션 오버헤드 감소: 단일 트랜잭션 내에서 여러 항목을 처리함으로써 시스템은 리소스 집약적인 트랜잭션 시작 및 커밋 작업 수를 줄입니다.
청크 관리 오버헤드 증가: 각 청크를 처리하면 약간의 추가 오버헤드가 발생하지만 일반적으로 트랜잭션 오버헤드 감소의 이점이 이보다 더 큽니다.

세부 분석 🔍

  • 개별 처리 오버헤드:
    레코드당 트랜잭션 오버헤드(T)를 10ms로 가정합니다.
    1백만 개의 레코드에 대한 총 오버헤드: 1,000,000 * 10ms = 10,000,000ms.

  • 청크 기반 처리 오버헤드 (모든 작업이 병렬로 된다는 가정)
    청크당 트랜잭션 오버헤드(T)를 20ms로 가정합니다.
    청크당 청크 관리 오버헤드(C)를 5ms로 가정합니다.
    1,000개 청크에 대한 총 오버헤드: 1,000* (20ms + 5ms) = 25,000ms.

비교표
개별 처리청크 기반 처리
필요한 트랜잭션 수1,000,0001,000
트랜잭션 오버헤드1,000,000 * 10ms = 10,000,000ms1,000 * 20ms = 20,000ms
청크 관리 오버헤드없음1,000 * 5ms = 5,000ms
총 오버헤드10,000,000ms25,000ms
자원 활용빈번한 트랜잭션으로 인해 자원 사용량이 높음청크 관리 오버헤드에도 불구하고 더 효율적임
처리량높은 트랜잭션 오버헤드로 인해 낮음감소된 트랜잭션 오버헤드로 인해 증가

결론 ✨

위의 경우 1000개의 데이터를 처리할 수 있는 메모리가 3개(2.5개 반올림) 이상이면 유리하다

청크 기반 처리는 청크 관리로 인해 약간의 추가 오버헤드를 발생시키지만 이는 일반적으로 트랜잭션 수를 줄임으로써 절감되는 비용에 비하면 미미합니다.
청크 관리로 인해 총 오버헤드가 더 높아 보일 수 있지만 효율성 향상 및 리소스 활용도 향상으로 인해 청크 기반 처리가 대규모 데이터 세트에 유리해집니다.

2. 향상된 확장성 🌐

청크 기반 처리를 통해 일괄 작업을 수평으로 확장할 수 있습니다. 여러 노드 또는 스레드가 서로 다른 청크를 동시에 처리하여 처리 용량과 속도를 높일 수 있습니다.

예: 분산 환경에서는 일괄 작업이 여러 서버로 분할되어 각각 데이터의 하위 집합을 처리할 수 있습니다. 이 병렬 처리는 단일 스레드 접근 방식에 비해 더 큰 데이터 세트를 더 빠르게 처리할 수 있습니다.

3. 내결함성 및 복구 🛠️

설명: 처리 중 오류가 발생하면 전체 작업이 아닌 현재 청크의 트랜잭션만 롤백하면 됩니다. 이러한 현지화된 오류 처리를 통해 복구 속도가 빨라지고 중단이 최소화됩니다.

예: 1000개 청크 중 500번째 청크 처리 중 오류가 발생하면 500번째 청크의 데이터만 롤백됩니다. 그런 다음 시스템은 이미 처리된 499개 청크에 영향을 주지 않고 500번째 청크 처리를 재시도하여 효율적인 오류 처리 및 복구를 보장합니다.

4. 향상된 로드 밸런싱 ⚖️

설명: 청크 처리는 클러스터의 스레드이든 노드이든 관계없이 여러 처리 장치에 워크로드를 균등하게 분산하여 로드 밸런싱을 향상시킬 수 있습니다.

예: 클러스터 환경에서는 서로 다른 노드가 서로 다른 데이터 청크를 동시에 처리할 수 있습니다. 이러한 균등한 작업 부하 분산은 단일 노드가 병목 현상을 일으키는 것을 방지하여 전체 시스템 성능을 향상시킵니다.

5. 최소화된 지연 시간 ⏳

설명: 더 작은 데이터 청크를 처리하면 항목이 메모리에서 처리되기를 기다리는 데 소요되는 시간이 줄어들어 지연 시간이 단축됩니다.

예: 스트리밍 애플리케이션과 같은 실시간 데이터 처리 시스템은 짧은 대기 시간을 유지하면서 데이터가 빠르게 처리되고 응답하도록 보장하므로 청크 처리의 이점을 얻습니다.

6. 더 나은 성능 모니터링 📊

설명: 청크 기반 처리를 통해 성능 지표를 더욱 세부적으로 모니터링할 수 있습니다. 이러한 세분화된 모니터링은 병목 현상을 식별하고 처리 파이프라인을 최적화하는 데 도움이 됩니다.

예: 각 청크의 처리 시간을 모니터링하면 데이터의 어느 청크 또는 부분이 지연을 일으키는지 식별하여 목표한 성능 개선이 가능합니다.

7. 재시도 및 논리 건너뛰기 구현이 더 쉬워졌습니다 🔄

설명: Spring Batch는 청크 수준에서 재시도 및 건너뛰기 논리에 대한 기본 지원을 제공하므로 전체 배치 작업에 영향을 주지 않고 일시적인 오류 및 데이터 무결성 문제를 강력하게 처리할 수 있습니다.

예: 청크를 처리하는 동안 네트워크 오류가 발생하면 시스템은 해당 청크 처리를 다시 시도할 수 있습니다. 특정 데이터 기록이 손상된 경우 전체 배치 프로세스를 중단하지 않고 추가 조사를 위해 해당 기록을 건너뛰고 기록할 수 있습니다.

8. 네트워크 오버헤드 감소 🌐

청크 처리로 인해 연결 설정 및 다수의 작은 패킷 전송과 관련된 오버헤드가 증가할 수 있지만, 이로 인한 네트워크 안정성 향상, 재시도 비용 감소 및 메모리 관리의 이점이 오버헤드를 상쇄할 수 있습니다.

예: 데이터가 여러 원격 서버에 걸쳐 처리되는 시스템에서 청크 처리는 관리 가능한 작은 데이터 조각만 한 번에 전송되도록 하여 네트워크 정체를 줄이고 데이터 전송 효율성을 향상시킵니다.

비교 표 📊

방식대량 데이터를 한 번에 전송데이터를 작은 청크로 나누어 전송
오버헤드 요소데이터 패킷 크기, 연결 설정, 전송 시간각 청크마다의 연결 설정, 다수의 작은 패킷 전송으로 인한 추가 오버헤드
장점낮은 연결 설정 오버헤드 및 한 번의 대량 전송으로 인한 효율성네트워크 부하 분산, 실패 시 재시도 비용 감소, 메모리 사용량 관리 용이
단점네트워크 혼잡, 급격한 메모리 사용량, 실패 시 높은 재시도 비용청크마다의 연결 설정 오버헤드 증가, 전체 전송 시간 증가 가능성

9. 단순화된 디버깅 및 유지 관리 🛠️

설명: 더 작고 관리 가능한 데이터 덩어리를 처리할 때 일괄 작업 디버깅 및 유지 관리가 더 쉽습니다. 전체 데이터 세트를 조사하는 대신 문제를 청크 내에서 격리하고 수정할 수 있습니다.

예: 특정 청크를 처리하는 동안 버그가 감지되면 개발자는 전체 데이터 세트를 디버깅하는 대신 해당 청크에 집중하여 문제를 식별하고 해결할 수 있으므로 유지 관리 프로세스가 더욱 간단하고 효율적이게 됩니다.

💡 결론

Spring Batch의 청크 기반 처리는 대규모 데이터 처리 작업을 처리하는 데 이상적인 선택이 되는 수많은 이점을 제공합니다.
리소스 사용 최적화, 내결함성 향상, 확장성 향상을 통해 청크 처리는 일괄 작업이 효율적이고 안정적으로 수행되도록 보장합니다.
이 방법을 사용하면 시스템은 높은 성능과 안정성을 유지하면서 대규모 데이터 세트와 복잡한 처리 요구 사항을 처리할 수 있습니다.



단어 정리 🌈

클러스터 환경

고가용성, 확장성 및 병렬 처리를 보장하기 위해 함께 작동하는 여러 컴퓨터(노드)로 구성된 그룹을 의미합니다.

스레드

운영 체제에서 수행할 수 있는 가장 작은 처리 단위입니다. 스레드는 프로세스의 구성 요소로, 단일 프로그램 내에서 병렬 실행을 허용합니다.

노드

클러스터 내의 단일 컴퓨터 또는 서버입니다. 클러스터의 각 노드는 작업을 수행하고 자원을 공유하며 데이터를 처리하기 위해 함께 작동합니다.

작업 부하

시스템이나 구성 요소가 수행해야 하는 처리 또는 작업의 양을 의미합니다. 컴퓨팅 맥락에서 이는 컴퓨터나 서버에 할당된 작업, 운영 또는 프로세스일 수 있습니다.

작업 부하 분산

여러 처리 단위(예: 스레드 또는 노드)에 작업이나 작업 부하를 고르게 분산시켜 자원의 균형 잡힌 활용을 보장하고 어떤 단위도 과부하되지 않도록 하는 과정을 의미합니다.

병목 현상

시스템에서 성능이나 용량이 제한되거나 제약을 받는 지점을 의미하며, 이로 인해 지연이 발생하고 전체 시스템 효율성이 감소합니다. 이는 하나의 구성 요소가 나머지 시스템의 처리량을 감당할 수 없을 때 발생하여 제한 요인이 됩니다.

참조

  • gpt
  • gemini
  • 교차 검증
profile
소프트웨어 관련 고민을 좋아하고 상황에 맞는 답을 함께 찾아가는 과정을 좋아합니다. 😀

0개의 댓글