- MySQL에 쌓이는 계좌 입출금 이력 데이터를,
- MySQL Binary Log connector를 통해 스트림으로 읽어 들이고,
- 읽어 들인 데이터를 계산하여 계좌별 잔고 데이터(materialized view)로 만든 뒤,
- 로컬 캐시(GuavaCache)에 저장한다.
- 일련의 데이터의 흐름은 반응형으로 처리하며,
- 계좌별 잔고 데이터는 HTTP API를 통해 사용자에게 제공할 수 있어야 한다.
- MySQL은 Docker를 이용함.
- 그 중에서도 Docker Official Images를 사용.
- 컨테이너 실행은
docker run --name mysql -e MYSQL_ROOT_PASSWORD=test -p 3306:3306 -d mysql:latest
- 그리고 mysql_native_password 설정.
alter user 'root'@'localhost' identified with mysql_native_password by 'test'
- 그 외 권한 등의 준비 작업은 mysql-binlog-connector-java README 참고.
- binary log client의 이벤트를 flux로 수신
- MySQL write row log를 적절한 Java 객체(WriteRowEvent)로 읽어들이기
- flux 파이프라인을 통해 WriteRowEvent를 전달하기
- flux 파이프라인을 통해 수신한 WriteRowEvent를 기반으로 계좌의 잔고 계산하기
- 생략하고 넘어갈 수 없는 에러가 발생한 경우에는 애플리케이션을 중단하기
[ ] 생략할 수 있는 에러가 발생한 경우에는 폴백 로직을 태우고 다음 처리를 계속하기- 파이프라인의 중간에 무거운 연산을 넣고 이를 비동기로 처리하되 이벤트의 순서는 보장하기
- 하나의 스트림을 여러 스트림으로 분할하여 병렬로 처리하기 by (TopicProcessor)
- flux의 가용한 스레드 갯수를 제어하여 애플리케이션 전체 장애가 나지 않게 하기
- flux overflow 에러가 나지 않도록 처리량을 적절히 제어하기