WSO2 CEP 기반 실시간 데이터 콜렉터(Collector) REST API 설계 및 쿼리 샘플
과거 재직하던 회사에서 개발한 빅데이터 모니터링 플랫폼의 핵심 경쟁력 중 하나는 수백 대의 장비에서 초당 수만 건씩 쏟아져 들어오는 JMX 및 시스템 메트릭 데이터를 “실시간(Real-time)“으로 처리하여 알람을 울려주는 아키텍처였습니다.
이를 구현하기 위해 앞서 발행한 글(WSO2 CEP와 스트리밍 연산)에서 설명한 바와 같이, 데몬의 중추에 CEP(Complex Event Processing) 엔진을 박아두었습니다.
가장 큰 기술적 고민은 “사용자가 UI 창에서 ‘CPU 90% 이상 1분 유지 시 알람’ 규칙을 새롭게 생성했을 때, 자바로 돌아가는 수집기(Collector) 데몬 프로세스를 껐다 켜지 않고 어떻게 저 새로운 규칙을 라이브 엔진 메모리에 주입할 것인가?” 였습니다. 이 문제를 해결하기 위해 Collector 데몬 자체에 경량 웹서버(Embedded 웹 엔진) 모듈을 띄워, 외부 스프링 UI 서버의 지시를 수신하는 전용 REST API 라우터를 뚫었습니다.
1. CEP Dynamic Rule Injection REST API
플랫폼 마스터 UI 서버는 이 엔드포인트를 찔러 스트리밍 쿼리를 실시간으로 Post 하거나 쓸모없는 알람 규칙을 Delete 날리는 구조로 통제력을 확보했습니다.
| API 통신 목적 | URI 엔드포인트 | METHOD | PARAM Payload | RESPONSE |
|---|---|---|---|---|
| 전체 룰 목록 조회 | /api/cep_rule | GET | - | 메모리에 로딩된 전체 CEP 쿼리 이름 리스트 배열 |
| 단일 룰 텍스트 조회 | /api/cep_rule/{id} | GET | - | 특정 ID 룰의 Siddhi QL 원문 텍스트 반환 |
| 신규 스트리밍 룰 주입 | /api/cep_rule/ | POST | Rule JSON | 메모리 파싱이 완료된 룰 객체 메타데이터 |
| 기존 룰 강제 회수 | /api/cep_rule/{id} | DELETE | - | 200 OK (엔진에서 스레드 드랍됨) |
2. 실전 CEP 쿼리 (Siddhi QL) 아키텍처 구조
아래는 실제로 UI에서 위 API를 통해 주입(POST)되어, 호스트들의 하둡 YARN 리소스매니저(ResourceManager) 지표를 1분 단위로 슬라이딩 윈도우(Sliding Window) 캡처하여 최대/최소 낙폭을 계산하는 스트리밍 쿼리문입니다. 데이터베이스(RDB)의 SQL 문법과 매우 흡사하지만 [window.time] 이라는 시계열 개념이 들어간 것이 가장 큰 특징입니다.
/* 1. 스트림의 입출력을 정의할 데이터 메타 골격 (스키마 정의) */
@Import('METRIC:1.0.0')
define stream input (
meta_SERVERTIME long,
meta_COLLECT_TIME long,
meta_METRIC_NAME string,
meta_HOSTNAME string,
meta_APP_ID string,
correlation_METRICS double
);
@Export('ALERT:1.0.0')
define stream output (
meta_COLLECT_TIME long,
meta_HOSTNAME string,
meta_APP_ID string,
meta_METRIC_NAME string,
correlation_METRIC double
);
/* 2. 본 쿼리: 실시간 데이터 버스에서 지나가는 강물을 퍼 올려서 필터링 (Where 절 역할) */
from input#window.time(1 min)[meta_APP_ID=='collector.yarn.resourceManager.YarnClusterMetrics']
/* 3. 메모리에 체류시킨 1분 치 데이터 배열의 Max/Min 차분 집계 연산 처리 */
select
max(meta_COLLECT_TIME) as meta_COLLECT_TIME,
meta_HOSTNAME,
meta_APP_ID,
'accumulate_aggregation' as meta_METRIC_NAME,
(max(correlation_METRICS) - min(correlation_METRICS)) / count(*) as correlation_METRIC
group by meta_HOSTNAME, meta_APP_ID
having correlation_METRIC > 0
/* 4. 조건에 걸러진 놈들만 붉은 사이렌을 울리기 위해 Output 배출 파이프라인으로 전송 */
insert into output;이 고도화된 실시간 윈도우 쿼리 인젝터 설계 덕분에, 하둡 장비가 500대 가까이 증설되는 빅데이터 금융권 프로젝트 환경에서도 디스크 I/O 없이 CPU와 Memory 단에서 이상 징후 알람을 원활하게 토해낼 수 있었습니다.