이 글은 책 내용을 토대로 작성하였습니다.
목차
스트림 처리
-
하나 이상의 입력 스트림을 처리해 하나 이상의 출력 스트림을 생산할 수 있다.
-
스트림을 처리하는 코드 조각을 연산자 혹은 작업이라 부른다.
스트림 조인
-
스트림은 끊임없이 이벤트가 발생하므로
스트림 상에서 수행하는 조인은
일괄 처리 작업에서 수행하는 조인보다 훨씬 어렵다.
스트림 스트림 조인 (윈도우 조인)
-
검색 기능이 있는 웹사이트에서 검색된 URL의 최신 경향을 파악하고자 한다.
그러면 어떤 키워드로 검색했는지와 그 검색 결과를 하나의 이벤트로 로그를 남긴다.
그리고 누군가 그 검색 결과에서 하나를 클릭 시 클릭을 기록하는 다른 이벤트를 로깅한다.
-
검색 결과에서 각 URL당 클릭률을 계산하려면
같은 세션 ID를 가져서
서로 연관되는 검색 이벤트와 클릭 활동 이벤트를 함께 모아야 한다.
-
사용자가 검색 결과를 쓰지 않고 버리면 클릭이 전혀 발생하지 않을 수 있다.
클릭이 발생했더라도 검색과 클릭 사이의 시간은 가변적이다.
-
대부분 몇 초내 검색 결과를 클릭하지만
검색 해놓고 다른 걸 하다 뒤늦게 클릭을 하여 엄청나게 오래 걸릴 수 있다.
-
또한 네트워크 지연과 같은 문제로
클릭 이벤트가 검색 이벤트보다 먼저 도착할 수 있다.
-
그래서 조인을 위한 적절한 윈도우 선택이 필요하다.
ex) 1시간 이내에 발생한 검색과 클릭을 조인한다.
정확한 클릭률
-
정확한 클릭률을 구현하려면 스트림 처리자가 상태(State)를 유지해야 한다.
-
예를 들어 지난 시간에 발생한 모든 이벤트를 세션 ID로 인덱스를 걸어둔다.
검색 이벤트나 클릭 이벤트가 발생할 때마다 해당 인덱스에 추가하고
스트림 처리자는 같은 세션 ID로 이미 도착한 다른 이벤트가 있는지 확인한다.
-
이벤트가 매칭되면 검색한 결과를 클릭했다는 이벤트를 생성하고
검색 이벤트가 클릭 이벤트 없이 만료되면
검색 결과가 클릭 되지 않았다는 이벤트를 생성한다.
스트림 테이블 조인 (스트림 강화)
-
위 그림(=사용자 활동 이벤트 분석 예제)에서 2개의 데이터 셋을 이용한다.
사용자 활동 이벤트 집합, 사용자 프로필 DB
-
이때 입력은 사용자 ID를 포함한 활동 이벤트 스트림이고
출력은 “사용자의 활동 이벤트 + DB에서 읽은 해당 ID를 가진 사용자 프로필 정보”가 추가된 활동 이벤트이다.
-
이 과정을 DB의 정보를 사용하여 활동 이벤트를 강화(Enriching)한다고 한다.
DB 테이블 최신화 방법
-
여기서 DB 질의는 원격 질의를 할 수 있지만
느리고 DB에 과부하를 줄 위험이 있어
상황에 따라 스트림 처리자 내부에 DB 사본을 갖고 있을 수 있다.
-
그런데 이렇게 사본을 갖고 있게 되면
최신 상태를 유지하기 위한 추가 작업이 필요하며
그 방법의 하나로 CDC를 사용할 수 있다.
-
스트림 처리자는 활동 이벤트를 스트림으로 받는 것처럼
사용자 프로필 DB의 변경 로그를 구독하여
실시간으로 로컬에 가진 DB 사본을 업데이트한다.