데브시스터즈의 data driven으로 서비스 운영 자동화 를 정리한 글 입니다.
[devsisters] data driven으로 서비스운영 자동화 (spark)
Log
high quality log의 조건
- schema를 정의하고 지킬것
 - QA시 log 검수단계를 포함
 - 개발 할때 logging을 고려한 설계
 - log 수집할때 자동화된 schema check + transformation
 
Log 활용
보상 - 미션 topology는 일반화 가능
- 레벨3을 달성하면 보석100개
 - 로그인 할때마다 하트 10개
 - 제빵소 3개를 지으면 고기젤리 5개
 - PVP 5번 승리하면 보석30개
 
→ Event를 N회 발생 시, Reward를 M개 지급
또한 log를 json으로 만들면 비교연산의 결합으로 만들 수 있음
game_id == "kingdom" && event == "level_up" && level == 3
Schema가 있는 Log dataset은 조건처리연산에 쓸 수 있다
Automation 조건
- log기반으로 동작
 - near-realtime event processing
 - 대량 트래픽 커버
 - 동적 이벤트 태스킹
 - event task scheduling 자동화
 
Dynamic CEP(Complexed Event Processing)
== event driven architecture + stream processing
Event Driven Architecture
특정 이벤트의 반응으로 동작
- Event Emitter: 이벤트를 받아 event channel로 던짐
 - Event Channel: 가공 후 consumer에게 전달
 - Event Consumer: 필요한 연산을 하고 output을 만듦
 
이벤트 처리 방식
- SEP(Simple Event Processing): 단일 이벤트 단위로 처리, 추출
 - ESP(Event Streaming Processing): SEP + continuous query, 이벤트의 연속적인 흐름을 추적하는 경우
 - CEP(Complexed Event Processing): 여러 이벤트를 프로세싱, 각 이벤트간의 관계등을 고려함, SEP에 패턴추론이나 다른 event를 엮는경우 CEP
 - OLEP(OnLine Event Processing)
 
Stream Processing
입력이 무한함, 전체 실행시간은 중요하지 않음, 빠른속도로 이벤트처리 및 결과제공, Latency와 Throughput이 중요함
토폴로지 확장(from apache storm, kafka streams)
- 태스크 매니징 컴포넌트 분산구조(from apache flink)
 - Context(from apache spark streaming)
 - Kafka Streams = Dynamic CEP Application
 
DCEP App in K8s
DCEP
- Dispatche API
- admin console의 입력을 받는 API server
 - event context를 정의하기 위한 데이터 관리
 - event processing schedule 생성
 - scheduler manager와 communication
 
 - Schedule Manager
- event plan에 따라 schedule 관리
 - 정해진 시각에 job manager 호출하여 event 실행
 - 시간이 완료되면 stream app으로 종료 요청
 
 - Job Manager
- worker의 master 역할
 - event context 생성
 - worker managing
 
 - Worker(Event Processing Manager)
- worker group - worker
 - event와 worker group은 1:1
 - 여러개의 event process가 schedule에따라 동시에 실행됨
- 관심있는 message를 여러 worker group들이 구독..
 
 
 - Event Context
- event를 trigger하기 위한 내용을 작성
- stream topic, keyedstream 연산 대상 필드, event 내용, type information
 
event_list: - topic: sample-access conditions: - field: event value: kill type: string operator: equals - field: gameCode value: 1302 type: integer operator: equals - field: useSkill value: true type: bool operator: equals count: 3 keyed: member.playerId 
 - event를 trigger하기 위한 내용을 작성
 


DCEP 핵심 기능
KeyedStream 변환연산

쏟아지는 많은 로그중 필요한 정보만 필터해서 process task로 던져줘야함
효율적으로 동작해야지 성능에 악영향을 미치지 않음
Flexible Topology
토폴로지 모델링: 모든 조건을 if ~ then 으로 변환
- 특정 이벤트 N회 수행 → 특정 로그 N회 발견
 - 특정 로그 N번 발견 → 매핑된 프로시저 호출
 
A로그 N번 && B로그 M번 && C로그 K번 → 프로시저 호출
조건을 일반화 해야만 함
Window (Time Window, Count Window)

native하게 window를 지원해줘야만 함
Stream Replaying
과거의 스트림 시점부터 replay
processing이 빠를경우 현재 레코드 속도를 따라잡아서 reatime processing에 붙을 수 있어야 함
Aggregation & Output
Dynamic Event
정적이벤트: 코드정의
동적이벤트: 런타임에 결정되는 stream processing topology (개발자의개입없이)
미션: 순차적 미션 달성 판단 (transaction처럼?), window연산
순서가 보장되지 않는 분산큐에서 어떻게 메시지 순서를 보장할것인가
- 로그 데이터에 실제 이벤트시간을 무조건 포함 (근데 초단위 쓰네?)
- 모든 스테이지마다 timestamp를 기록함.
 - 순서가 바뀌어도 복구가능
 
 - Event Processing bucket
- unbounded event stream → bounded set으로 치환하는 객체
 - PSA(portable service abstraction) 패턴 적용시 여러가지로 변환가능
- Linked List - 분산처리 불가능
 - DBMS Table - 분산처리 가능하지만 부하
 - Redis SortedSet - 분산처리가능하지만 persistence 문제 (물론지원함)
 
 
 - 조건이 두개인경우 event bucket활용
- 레벨30달성 뒤 던전 클리어
- level30달성 12분, 던전클리어 15분 → 미션 달성
 - 던전클리어 15분, level30달성 20분 → 미션 실패
 
 
 - 레벨30달성 뒤 던전 클리어
 - 조건이 3개이상인경우 event bucket + event buffering
- 데이터를 event bucket에 버퍼링, 워터마크 범위에 따라 연산
 - event bucket안에서 순서대로 재정렬됨
 - watermark: max(lag) / (throughput/s)
 
 
Window 연산을 어떻게 구현해야 하는가
- event buffering과 유사하므로 event processing bucket으로 처리가능
 
대량의 로그를 near-realtime으로 처리
- 이벤트 프로세싱 매니저를 k8s node에 분산
 - stream batch unit 을 늘려서 throughput상승, 병렬 연산처리하여 Latency 감소
 - processing sequence의 앞쪽에 cardinality가 높은 조건을 배치하여 filter out
 - 동시에 여러 event processing을 핸들링하면 bin packing 필요