[에스퍼] 간단한 실시간 이벤트 처리 기술

espertech_logo_transparent
Coupon For air jordan
에스퍼는 실시간 이벤트에 활용되는 대표적인 오픈소스이다. 일명 CEP, Complex Event Processing을 위한 솔루션 중에 하나인데 오픈소스이면서 문서화가 잘 되어 있으면서 안정적이라 실시간 이벤트 처리에 많이 사용된다. CEP에 대해서 궁금한 점이 있다면 현재 학습하면서 조금씩 업데이트는 하는 위키를 참조하면 된다.
nike air jordan 23
이 포스팅은 에스퍼 엔진을 실제로 스탠드얼론 자바 프로그램에 올려 코딩해 보는 간단한 실습내용이다. 에스퍼 문서는 에스퍼 레퍼런서와 IO관련 레퍼런스가 있는데 4.9.0 버전 기준으로 페이지수가 각각 712, 52가 된다. 천천히 읽고 있지만 이 레퍼런스에서는 실제 설치 및 활용에 대한 예제가 없다. 다만 블로그 상에 몇몇 글 1이 있긴 하지만 조금 달라진 부분도 있어서 이 포스트를 남겨둔다.

우선 에스퍼 프로젝트 다운로드 링크로 들어간다. 페이지에 들어가면 Esper EE, Esper HA, Esper가 있는데 여기서 “Esper” 최신버전 2를 다운받는다. Esper EE와 Epser HA는 Esper 엔진 기반의 추가적인 기능이 부가된 것으로 실제 다운로드 하려면 가입이 승인의 절차가 필요한다. Esper만 다운 받아도 충분히 사용하는데 문제가 없다.
air jordan iv
다운 받아서 압축을 풀면 다음과 같이 여러 개의 폴더와 jar 라이브러리리가 나온다.
air jordan Korea
esper folder contents

자세히 보면 폴더와 jar 라이브러리의 이름이 하나씩 매칭되어 있다는 것을 알 수 있다. 즉 각 폴더는 해당 라이브러리와 관련된 문서와 의존관계에 있는 라이브러리 등이 있다. 또한 example 폴더 안에 들어가면 다양한 예제 소스도 있다.
oakley overthetop sunglasses
이 포스팅에서 실습할 예제에 대해 간단한 요구사항을 적어보면 임의의 후보들에게 점수를 부여하는 이벤트들을 임의로 생성해서 에스퍼로 보내서 특정 후보의 점수 평균과 카운트를 뽑아내는 프로그램이다.
nike air max 97
우선 이클립스에서 자바프로젝트를 하나 생성한다. 생성하고 난 후 에스퍼 라이브러리와 에스퍼 라이브러리가 참조하는 추가 라이브러리를 프로젝트에 포함시킨다. 에스퍼 라이브러리는 압축을 풀고 난 폴더 바로 밑에 “esper-4.9.0” 이름으로 있고 다른 라이브러리는 “{압축 푼 장소}/esper-4.9.0/esper/lib” 폴더에 들어가면  있다. 자 이제 모든 준비는 끝이 났고 코딩만 하면 된다. 에스퍼를 활용하기 위해서 포함시켜야 할 것은 크게 세가지다.

  1. 이벤트 타입 정의
  2. 에스퍼 기본 설정과 EPL 입력
  3. UpdateListener 구현

에스퍼에서는 이벤트 타입으로 다양한 형태를 입력받을 수 있다. 간단한 POJO부터 Map, Hash도 가능하고 XML이나 RDB도 가능하다. 여기서는 다. 서두에 정의한 요구사항대로 특정 후보에 대해서 점수를 매기는 이벤트를 만들려면 이 이벤트는 최소한 사람의 이름과 점수를 속성으로 가져야 하고 다음과 같이 POJO로 간단하게 이벤트를 정의할 수 있다.

이벤트 타입을 정의했다면 실제 메인에서 돌아갈 수 있도록 에스퍼 설정을 해야한다. 일단 코드를 보자.

소스를 보면 첫 번째 라인에서 에스퍼의 configuration 객체를 하나 생성하고 2번째 라인에서는 위에서 생성한 이벤트 타입을 등록시킨 것을 볼 수 있다. 그리고 3번째 라인에서는 configuration 객체를 전달해서 새롭게 epService라는 객체를 생성시켰다. 이 객체를 통해서 나중에 우리는 이벤트를 생성해서 에스퍼에 전달하게 된다는 것을 기억해 둔다.

다음으로는 이벤트들을 탐지할 EPL을 생성해야 한다. EPL은 Event Processing Language의 약자로 SQL과 유사한 형태의 이벤트 처리 언어라고 생각하면 된다. 나중에 에스퍼 레퍼런스를 참조하면 대부분의 내용이 이 EPL을 설명하고 있다는 것을 확인하게 될 것이다. 즉 EPL을 얼마나 잘 사용하느냐가 중요한 관건이다. 그러나 DB에서 SQL에 익숙하다면 그리 어렵지 않게 이해할 수 있다. 다음의 소스를 보자.

epl이라는 문자열에 우리가 원하는 이벤트 탐지를 위해 EPL을 작성해 넣었다. 이 EPL의 의미는 지난 30초 동안 들어온 VotingEvent에서 candidate가 NFM인 이벤트들의 평균 rating과  이벤트의 개수를 구하는 것이다. 자세히 들어다보면 SQL과 같이 select, from, where로 되어 있다는 것을 알 수 있다.

여기서 EPL에 대해서 다 설명할 수는 없지만 간단하게 DB와 비교하면 이렇다. DB에서 table의 개념은 에스퍼에서 스트림이라는 개념으로 볼 수 있다. 스트림은 간단하게 설명하면 이벤트가 생성되어서 들어오는 통로라고 생각하면 된다. 그리고 DB에서의 하나의 레코드가 에스퍼에서는 이벤트에 해당되며 DB에서의 열에 해당하는 필드가 에스퍼에서는 이벤트에 속성애 해당한다. 소스의 2번째 라인과 같이 이렇게 EPL 문자열을 위에서 생성한 epService에 등록하면 두번째 준비도 끝이난다.

마지막으로 Update Listener를 구현해야 한다. 에스퍼에서는 epl에 해당하는 이벤트가 탐지될 경우 어떤 액션을 할 것인가를 구현할  수 있도록 UpdateListener 인터페이스를 제공한다. 따라서 자신의 입맛에 맞게 UpdateListener를 상속받아 적절한 프로세싱을 하면 된다.

위 소스에서는 UpdateListener 인터페이스를 상속받아 “update”라는 메소드를 구현한 것을 볼 수 있다. update 메소드는 반드시 구현해야 하는 것으로 새롭게 들어온 이벤트들을 어떻게 처리할 것인지를 이 메소드 안에서 구현하면 된다. 우리는 아주 간단하게 들어온 이벤트의 평균 점수와 숫자를 출력하도록 정의했다.

참고로 update메소드의 매개변수를 자세히 보면 newEvents와 oldEvents 배열이 있는 것을 확인할 수 있다. 에스퍼는 모든 이벤트들을 다 감지할 수 없기 때문에 탐지하는 이벤트들의 스코프를 정해놓고 이를 윈도우라고 한다. 이 예제에서는 30초라는 시간 윈도우를 두었고 30초간의 윈도우를 벗어난 이벤트들은 oldEvent 형태로 이 update 메소드를 지나간다.

위에서 말한 대로 세 가지를 모두 다 했으니까 끝이 났다…가 아니다 ;; 딱 두가지가 더 남아 있다. 하나는 방금 구현한 Update Listener를 에스퍼 엔진에 연결시켜줘야 하고 마지막으로 애드혹하게나마 실습을 위해서 임의로 이벤트들을 생성시켜주는 generator같은 것이 필요하다.

리스너 등록은 간단하다. 이 소스를 아까 epl 문장을 등록한 곳 바로 밑에다 추가하면 Update Listener 등록이 끝난다.

마지막으로 실습을 위해 임의로 이벤트를 생성하고 생성한 이벤트를 epService객체에 던져주는 코드만 짜면 된다. 이 부분은 순전히 애드혹하게 실습을 위해 만든 것이다. 소스를 한번 보자.

소스는 “EventCreateNum” 만큼 임의로 이벤트의 속성 값을 만들어서 VotingEvent 객체를 만들고 이를 epService에 sendEvent 메소드를 통해서 던져주는 간단한 예제이다.

자 돌려보자!

에스퍼 스타트 프로그램 실행화면

스크린샷에서 보는 바와 같이 이벤트가 주기적으로 발생하는가운데 EPL에 해당하는 이벤트가 탐지되었을 때에 평균 점수와 이벤트 숫자를 출력해 주는 것을 확인할 수 있다. 처음 log4j 경고문구는 이 예제에서 log4j 설정을 따로 하지 않아서 그런 것이므로 무시해도 된다. 필요할 경우 처음에 log4j 설정만 넣어주면 된다.

지금까지 한 예제는 github에 올라가 있으며 메이븐을 통해서 빌드하면 관련 라이브러리도 다 받아서 실행할 수 있다. https://github.com/jwj0831/EsperStudyProject

  • 우진이 형이다ㅎㅎ

    • jwj0831

      웰컴~ ㅎㅎ 오랜만 ^^