-
How to use Spring Cloud Dataflow - 이세왕세미나, 영상 요약정리 2023. 7. 26. 00:01728x90
https://www.youtube.com/watch?v=awIHq5CyxPg
라인플러스의 이세왕님의 발표를 요약해 보면서 Spring Cloud DataFlow에 대해 알아보고자 합니다.
주요 내용
Spring Cloud Dataflow란?
실무에서 어떻게 사용되는지?
Spring Cloud Dataflow란?
- 데이터를 Function 단위의 Application으로 파이프라인을 구성할 수 있게 함
- Batch, Stream을 구성하는 application과 application 간의 Channel을 관리해 줌 kafka로 예시를 들면(topic, group, partition 등을 관리)
- Target Platform에 따라 application을 배포해줌
실행하기에 필요한 플랫폼들
- docker
- data flow server
- skipper
- database
로걸 환경이란 Cloud Platform 환경이 달라서 웬만하면 Cloud Platform 환경으로 하는것을 추천하심
Cloud Platform (k8s)
skipper가 spring cloud deployer를 사용하고 있음
Helm을 통해 install 가능
자세한 내용은 공식문서 참고
https://dataflow.spring.io/docs/2.8.x/installation/kubernetes/
DashBoard
Stream, Tasks Application을 등록, 삭제, 변경하고 기 등록된 목록을 사용할 수 있습니다.
Stream, Tasks에 대한 상태를 확인할 수 있습니다.
Stream을 생성할때는 Source와 Sink는 필수요소이고 Processor는 Optional이다.
Task를 스케쥴링할때는 CronExpression에 주의해야 합니다.
Dataflow의 Timezone이 UTC+9인데 쿠버네티스 환경이 UTC라면 UTC기준으로 CronExpression을 적용했습니다 (2021년기준)
해당사항에 대해 발표자분이 PR을 올려주셨고, issue는 Close된 모습입니다.
https://github.com/spring-cloud/spring-cloud-dataflow/issues/4303
왜 DataFlow를 써야하나?
빠른 개발과 빠른 수정이 가능하다.
익숙한 Spring Boot로 Function단위의 application을 만들어서 Stream을 생성할 수 있다.
무중단 배포를 지원하고, 분산처리, 확장성에 용이하다.
실무 적용기 - 예전 아키텍처
사용자에게 적합한 광고를 보여주는 과정에서 ElasticSearch의 데이터구조 설계가 잘못되어 있었습니다.
예를들어 나이키를 검색했을때 해당 키워드에 데이터가 몰리는 구조로 되어있고, 해당 데이터를 메모리에 올리는 과정에서 GC가 발생하여 트래픽이 튀었습니다.
근본적으로 ES를 해결해야하지만, 당장 장애를 해결하기 위해 Redis로 캐싱을 수행했습니다.
하지만 전시 API에서 광고 서버의 150ms 아래로 떨어트려 달라는 미션을 줍니다.
Flush를 할때 Caching Logic을 타면서 병목현상이 발생하게 되었습니다.
Flush Time을 늘리면 되지만 실시간으로 서빙해야 하는 광고에 문제가 발생할 소지가 있었으며, Flush time을 줄이면 트래픽이 불안정해졌습니다.
해결을 위한 다양한 아이이디어
- ES의 GC를 튜닝하자
- ES의 index자체가 잘못된거니까 리모델링하자
- Backgournd에서 Redis에 Cache 데이터를 넣어주자(DataFlow)
Why DataFlow Stream?
- Dataflow의 Stream으로 Cache 데이터를 insert or update할 수 있다.
- Business Logic에만 집중적으로 개발하면 된다
- 코드 수정시 무중단 배포(k8s)
- 트래픽에 따라 분산처리 가능 (HPA)
- Stream이 실시간 환경에서도 확장 가능
실무 적용기 - 변경된 아키텍처
ES는 Fadeout되고 Redis와 SCDF로 구성된 아키텍처
- jdbc에서 10분초에 한 번씩 DB Query, query는 30분전의 데이터를 가져옴
- 필터에서는 서빙 되어야 할 광고만 필터
- redis에 저장
인스턴스를 늘려야하면 properties설정으로 늘린다.
Stream을 확장해야 한다면?
데모에서 나온다, 쉽게 가능
컴플레인 발생
광고를 내렸는데 10초동안 광고가 송출되어서 비용이 청구..
이제 jdbc source를 cdc-source로 변경하여 realtime caching을 수행
cdc는 간략하게 데이터의 변경을 감지하여 어떻게 바뀌었는지 이벤트를 발행합니다.
이제 실시간으로 동작!
실패사례
하루에 한번 batch성 작업이 있는데 왠지 stream이 땡겨서 시도해봄
하루에 한번 조회된 데이터를 몇백만건 ~ 몇천만건
메시지 미들웨어에서 OOM이 발생하여 실패
이런 작업은 task로 처리해야 한다.
데모는 영상에서 보시면 어떻게 DashBoard로 구성하는지 쉽게 알 수 있습니다
'세미나, 영상 요약정리' 카테고리의 다른 글
토스 SLASH 23 - Kafka 이중화로 다양한 장애 상황 완벽 대처하기 (0) 2023.08.20 토스 SLASH 22- 애플 한 주가 고객에게 전달 되기까지 (0) 2023.07.30 Batch Performance 극한으로 끌어올리기: 1억건 데이터 처리를 위한 노력 (1) 2023.05.31 유지보수하기 좋은 코드를 구현하는 방법 - 박재성(자바지기) (1) 2023.05.17 [NHN FORWARD 22]DDD 뭣이 중헌디? (0) 2023.05.10