Circuit Breaker — 메모리가 터지기 전에 요청을 먼저 거절한다
Elasticsearch Circuit Breaker 및 Highlighting 공식 문서 종합 (웹 리서치, 2026) — Elastic 공식 문서(circuit-breaker-settings, highlighting, how-es-highlighters-work-internally) Elastic 공식문서 Circuit breaker settings
이 모듈을 다 읽으면
- elasticsearch-learn-06의 fielddata 함정이 실제로 circuit breaker에 의해 어떻게 사전 차단되는지 설명할 수 있다
- parent/fielddata/request 서킷 브레이커가 각각 무엇을 감시하는지, 그리고 parent가 왜 '합계'를 본다는 것인지 설명할 수 있다
elasticsearch-learn-06에서 다룬 fielddata 함정(집계를 위해 필드를 전부 메모리에 올리다가 힙이 터지는 문제)을 전제로, Elasticsearch가 실제 OOM이 나기 전에 이런 요청을 먼저 거절하는 안전장치인 circuit breaker의 구조를 정리한다.
여러 종류의 서킷 브레이커가 각자의 영역을 감시한다
fielddata 서킷 브레이커는 어떤 필드를 fielddata 캐시로 올릴 때 필요한 힙 메모리를 미리 추정해, 그 추정치가 사전에 정한 한도를 넘으면 아예 로딩 자체를 막고 에러를 반환한다(elasticsearch-learn-06에서 다룬 fielddata 문제를 이 브레이커가 사전에 걸러내는 것이다). request 서킷 브레이커는 요청 하나를 처리하는 동안 쓰이는 임시 자료구조(예: 집계 계산 중 만들어지는 중간 데이터)가 일정 메모리를 넘지 못하게 막는다.
핵심 포인트
- fielddata 브레이커: 필드를 fielddata 캐시로 올리기 전에 필요한 힙 메모리를 추정, 한도 초과 시 로딩 자체를 차단 — module06의 fielddata 문제를 사전에 걸러내는 실제 메커니즘
- request 브레이커: 요청 하나 처리 중 쓰이는 임시 자료구조(집계 중간 데이터 등)가 한도를 넘지 못하게 차단
parent 서킷 브레이커 — 개별 브레이커들의 '합계'를 본다
parent 서킷 브레이커는 fielddata/request 등 여러 개별 브레이커가 사용 중인 메모리의 '총합'을 감시한다 — 개별 브레이커 하나하나는 한도 안에 있어도, 여러 브레이커의 사용량을 다 더한 값이 parent의 한도를 넘으면 예외가 발생한다. parent의 시작 한도는 indices.breaker.total.use_real_memory 설정에 따라 다른데, false면 JVM 힙의 70%, true(실제 메모리 사용량을 직접 측정)면 95%가 기본값이다. 즉 parent 브레이커 예외를 만났다면 특정 기능 하나의 문제가 아니라 여러 요청이 누적해서 메모리를 쓰고 있다는 신호로 봐야 한다.
핵심 포인트
- parent 브레이커: 개별 브레이커(fielddata/request 등) 사용량의 총합을 감시 — 각각은 한도 이내여도 합계가 넘으면 예외
- parent 시작 한도는 indices.breaker.total.use_real_memory=false면 힙의 70%, true(실측)면 95%가 기본값