Show GN: 바로 사용 가능한 가볍지만 빠른 사용자 행동/이벤트 수집기(rust) 오픈 소스
(github.com/lee-lou2)사용자 행동이나 이벤트 자체 수집이 필요하다면 꼭 한 번써보세요(제발🙏) 분명 만족하실겁니다!
러스트를 이용해서 가볍지만 빠르게 데이터 수집이 가능한 웹서버를 개발했습니다
코드가 간단해서 러스트에 익숙하지 않은 분들이라도 쉽게 코드 변경 등의 커스텀이 가능합니다 (필요하다면 제가 일부 수정해드릴 수 있음 🥳)
이벤트 수집기는 다음과 같이 구현되었습니다
기술 스펙
- 개발 언어 : rust(axum)
- 저장소 : 이벤트 저장(오픈서치), 펜딩 데이터 저장(Sqlite3)
다른 저장소도 사용 가능하도록 추가할 예정
시스템 구조
API 종류
- GET /ping : 헬스체크
- POST /events : 이벤트 수집
수집 데이터
- Headers 에 포함된 토큰의 사용자 정보
- Headers 에 포함된 디바이스/앱 정보
- Body 에 포함된 이벤트 상세 정보
스키마 변경만으로 간단히 수정 가능 👍
기술 상세
기본 구성(간단한 설명)
- 10만개의 채널 : 요청 받은 이벤트를 컨슈머로 전달하는 역할, 10만개의 채널이 모두 차있는 경우 데이터베이스에 펜딩 이벤트 저장
- 10개의 쓰레드 + 컨슈머 : 채널로부터 이벤트를 받아와서 1000개씩 묶거나 10초 동안 쌓인 이벤트를 오픈 서치에 저장
- 1개의 스케쥴러 : 펜딩 데이터베이스에 저장된 이벤트를 특정 시간 주기로 불러와 다시 채널로 전달
데이터 생성 요청(http)
- http api 를 이용해서 데이터 생성 요청
- 요청을 받으면 채널로 전달, 채널이 모두 차있으면 펜딩 데이터베이스에 저장
이벤트 컨슈머(10개의 경량 쓰레드)
- 채널로부터 받은 이벤트를 1000개씩 묶어 오픈서치 대량 등록 요청
- 1000개가 쌓이지 않은 경우 10초 단위로 쌓인 이벤트를 오픈서치에 대량 등록
- 오픈서치 등록 실패 시 펜딩 데이터베이스에 저장
펜딩 이벤트 등록(Sqlite3)
- 채널이 꽉 차거나 오픈서치 등록 오류 발생 시 펜딩 데이터베이스에 저장
스케쥴러
- 펜딩 데이터베이스에 쌓인 이벤트를 특정 주기로 조회해서 채널로 전달
- 추후 연속으로 쌓이는 이벤트나 데이터 문제로 오픈서치 저장 안되는 이벤트는 별도 처리를 추가할 예정
채널 수나 경량 쓰레드 수는 배포되는 환경의 리소스나 오픈서치 종류에따라 조정해야합니다 💪
아직 러스트 2~3개월차라 문법은 조금 어색할 수 있습니다 꾸준히 개선해나갈 예정입니다
많은 관심 부탁드려요 다양한 피드백도요~~~
감사합니다 🙇♂️