기본 콘텐츠로 건너뛰기

Drools Fusion "Steam mode" Issue and Solution

ESP(Event Stream Processing)

센서, CCTV등 다양한 소스(Source)에서 들어오는 실시간 이벤트를 이벤트 스트림이라고 한다. 그리고 이벤트 스트림을 받아서 이를 실시간으로 처리하는 것을 Event Stream Processing이라고 한다. 처리라는 것은 대부분 특정 이벤트에 대해서 사용자가 원하는 동작 또는 알람을 보내는 작업을 말한다.

이슈 발생

대용량 이벤트 처리 기술은 항상 퍼포먼스와 안정성이 중요하다. 지금은 서버에서 Drools Fusion을 사용하고 있다. 이전 버전에서 Esper를 사용하였으나 라이센스 문제로 인해서 Drools Fusion으로 옮겨왔다.
문제는 성능 테스트 중에 발생하였는데 메모리 leak 문제였다. “Always” 문제였기 때문에 문제점 파악은 쉽게 되었다.



테스트 방법

* 5대의 서버를 준비
* JMeter _를 이용하여 throughput을 조절해가며 이벤트 발생
* 1대의 서버에 서버 App 실행
* JConsole을 이용하여 JVM Heap 사이즈를 모니터링

결론

최종적으로 이벤트가 고속이든, 저속이든 Heap 사이즈가 늘어난다는 판단

분석 방법

JMap을 이용하여 Memory Dump하였다. 그리고 메모리 덤프 분석툴인 MAT를 이용하여 Dump 분석 결과를 확인

분석 결과

모든 이벤트 오브젝트가 Drools hashmap에 reference되어 있었다.

문제 해결 과정(How to solve)

우선은 내 코드들을 의심해봤다. 이벤트 수신, Pooling, 처리, 저장, DB Access 부분을 모두 훓어 보았다. 그러나 문제가 될 만한 부분은 찾지 못했다. 이건 뭐지? 내 상식 이상의 뭔가가 있나 한참을 고민했다. 결국은 소스 코드를 링크해서 디버깅을 해야하나, 소스 코드 분석을 해야하나 고민하면서 Drools 메뉴얼을 훓어 보다가 머리 속에서 스파크가 팍 튀었다. 다음은 Drools Fusion User Manual이다.

 The engine will make this analysis for the whole rulebase and find the offset for every event type. Whenever an implicit expiration offset clashes with the explicit expiration offset, then engine will use the greater of the two.

Drools Fusion은 ESP를 위해서 “STREAM.MODE”를 지정해야 한다. 이 때, Event를 정의하여 사용한다.
위의 메뉴얼 내용은 언제 이벤트가 제거되는지에 대한 설명인데 engine will use the greater of the two.
즉, 둘다 없을 경우에는 비교되는 값이 없기 때문에 사라지지 않는다는 것이다.
그러나 그것은 말이 안된다. 둘다 없을 경우에는 사실은 들어오자마자 사라져야 하는 것이 맞다. 아무래도 코드 상에서 두 케이스 모두 없을 경우에 대한 예외 처리가 없는듯하다.

해    결(Solution)

그래도 어찌되었건, 오픈 소스 디펙이 있더라도 문제를 해결해야 하는 것이 프로그래머 아니던가.
결국에는 다음과 같이 해결하기로 했다.
사실 Temporary condition을 쓰지 않는다면 SteamMode를 사용할 필요가 없다. 그러나 우리 시스템 특성상 평소에 설정이 없을 경우에는 CloudMode처럼 사용하다가 설정이 추가될 경우에는 StreamMode로 동작하게 되니 우회적으로 해결해야겠다는 생각이 들었다.
SteamMode에서 시간 관련 함수를 쓰지 않는다면, 명시적(explicit)으로 expired time을 설정해줘야지 이벤트가 GC에서 사라진다. 그러나 이것은 확실히 버그 같다.

댓글

이 블로그의 인기 게시물

REST Web Service에서 Projection 기능 활용

REST Web Service에서 Projection을 이용한 웹 인터페이스 유연성 확보하기. Projection 기능이란?   프로젝터와 같이 실제하는 물체를 보고 싶은 형태로 볼 수 있게 도와주는 기능을 말한다. 좀 더 쉽게 말하면 실제하는 물체란 필름을 말하는 것이고, 보고 싶은 형태란 70인치 화면으로 보여주는 것을 말한다. 설정에 따라 30인치 화면으로 볼 수도 있다.   즉, Projection 기능이 있다면 상황에 맞는 화면 크기로 보여 줄 수 있는 것이다. [프로젝터] 웹 인터페이스 설계의 어려움   웹서버를 개발하는 개발자 입장에서 하나의 인터페이스라도 만드는 일은 쉽지 않다. 그렇기 때문에 웹 인터페이스의 개수를 줄이려고 노력하는 것이 일반적이다. 그러기 위해서는 좀 더 일반적인(General) 형태의 인터페이스로 설계하는 수밖에 없다. 그러나 아이러니하게도 사용자(인터페이스를 사용하는 다른 개발자) 입장에서는 이런 일반적인 인터페이스를 쓰기란 여간 어려운게 아니다. 클라이언트마다 필요한 데이터가 다르다.  REST 웹서비스에서는 리소스에 해당하는 데이터를 다음과 같이 JSON 형식의 Response로 전달해준다. 예를 들어 다음과 같이 상품 정보를 보내주는 RESR API가 있다고 해보자. GET /api/furniture/item/123334333 위의 REST API를 이용하여 다음과 같은 데이터를 받을 수 있다. { "item_id" : 1233343333 , "name" : "chair" , "category" : "furniture" , "price" : 56000 , "seller" : "Makers" , "description" : "Goo...

DrJava 설치 방법

  보통 Java를 사용하여 프로젝트를 만들때, Eclipse라는 IDE(Integrated Development Environment)를 사용합니다. 그러나 Java를 처음 배우려는 사람들에게 복잡한 프로젝트까지 커버할 수 있는 Eclipse는 다양한 환경 설정, 복잡한 UI가 어렵게 느껴질 수 있습니다. 이런 사람들을 위해서  DrJava를 추천합니다.   DrJava 란?    LIDE(Lightweight IDE)라고 할 수 있습니다. 기본적으로 자바를 학습하려는 사람들을 위해  디자인되었습니다. 직관적인 인터페이스를 제공하고, line by line으로 자바 코드를 실행할 수 있는 interactive console을 제공합니다. 설치 순서 1. jdk 설치 2. DrJava 설치   2-1.   http://drjava.sourceforge.net 사이트에 접속   2-2. Current Stable Release 에서 본인의 환경에 맞는 App 다운로드   2-3. 만약 다음과 같은 경고창을 보았을 경우 java jdk나 jre가 제대로 설치 되었는지 확인 3. 설치 완료 후 실행 4. 다음과 같이  DrJava가 실행된다.

Spring Data Projection 기능 활용

Projection Spring Data REST에서는 Projection 기능을 제공하고 있습니다. Spring Data란?   Data Access Layer에 대한 추상화 기능을 제공하는 프레임워크입니다. 간단히 설명하자면 기존에는 Database에 데이터를 저장하고 읽어오기 위해서는 Database의 종류, 스키마를 고려하여 SQL Query를 사용해서 데이터를 저장하고 읽어왔습니다. 그러나 Spring Data를 이용하게 되면 이 과정을 ORM을 사용하여 함수를 사용하여 쉽게 처리할 수 있습니다. ORM(Object Relational Mapping)란?   데이터베이스가 테이블, 필드간 상관 관계를 통해 도메인 데이터를 표현하였다고 한다면,  ORM은 Object, 클래스 간의 상관 관계를 통해 도메인 데이터를 표현하는 것을 말합니다. 다음의 링크는 Spring Data REST Documentation 중에서 Projection 부분입니다.               8. Projections and Excerpts 그러나 실제 "Projection" 기능을 사용하는데는 한가지 문제점이 있습니다. 레거시 웹서비스를 쓰고 있다거나, Spring Data  REST를 이용하지 않는다면 "Projection" 기능을 활용하는 것이 힘들다는 것입니다. Spring Data REST의 경우 데이터  Response Type이 json-hal 타입만을 지원하기 때문입니다. JSON-HAL 타입으로 경우 웹서비스 제공 입장에서 최선의 선택일 수 있습니다. 그러나 실제 프로젝트에서는 이를 쓰려는 클라이언트가 없을 경우 사용할 수 없게 될 것입니다. 그렇다면 Projection 기능만을 사용할 수 있는 방법이 없을까요? 있습니다. ProjectionFactory 를 직접 사용하는 것입니다. 다음과 같이 Spr...