9P by leelou2 2달전 | ★ favorite | 댓글 1개

사용자 행동이나 이벤트 자체 수집이 필요하다면 꼭 한 번써보세요(제발🙏) 분명 만족하실겁니다!

러스트를 이용해서 가볍지만 빠르게 데이터 수집이 가능한 웹서버를 개발했습니다

코드가 간단해서 러스트에 익숙하지 않은 분들이라도 쉽게 코드 변경 등의 커스텀이 가능합니다 (필요하다면 제가 일부 수정해드릴 수 있음 🥳)

이벤트 수집기는 다음과 같이 구현되었습니다

기술 스펙

  • 개발 언어 : rust(axum)
  • 저장소 : 이벤트 저장(오픈서치), 펜딩 데이터 저장(Sqlite3)

다른 저장소도 사용 가능하도록 추가할 예정

시스템 구조

API 종류

  1. GET /ping : 헬스체크
  2. POST /events : 이벤트 수집

수집 데이터

  • Headers 에 포함된 토큰의 사용자 정보
  • Headers 에 포함된 디바이스/앱 정보
  • Body 에 포함된 이벤트 상세 정보

스키마 변경만으로 간단히 수정 가능 👍

기술 상세

기본 구성(간단한 설명)

  • 10만개의 채널 : 요청 받은 이벤트를 컨슈머로 전달하는 역할, 10만개의 채널이 모두 차있는 경우 데이터베이스에 펜딩 이벤트 저장
  • 10개의 쓰레드 + 컨슈머 : 채널로부터 이벤트를 받아와서 1000개씩 묶거나 10초 동안 쌓인 이벤트를 오픈 서치에 저장
  • 1개의 스케쥴러 : 펜딩 데이터베이스에 저장된 이벤트를 특정 시간 주기로 불러와 다시 채널로 전달

데이터 생성 요청(http)

  • http api 를 이용해서 데이터 생성 요청
  • 요청을 받으면 채널로 전달, 채널이 모두 차있으면 펜딩 데이터베이스에 저장

이벤트 컨슈머(10개의 경량 쓰레드)

  • 채널로부터 받은 이벤트를 1000개씩 묶어 오픈서치 대량 등록 요청
  • 1000개가 쌓이지 않은 경우 10초 단위로 쌓인 이벤트를 오픈서치에 대량 등록
  • 오픈서치 등록 실패 시 펜딩 데이터베이스에 저장

펜딩 이벤트 등록(Sqlite3)

  • 채널이 꽉 차거나 오픈서치 등록 오류 발생 시 펜딩 데이터베이스에 저장

스케쥴러

  • 펜딩 데이터베이스에 쌓인 이벤트를 특정 주기로 조회해서 채널로 전달
  • 추후 연속으로 쌓이는 이벤트나 데이터 문제로 오픈서치 저장 안되는 이벤트는 별도 처리를 추가할 예정

채널 수나 경량 쓰레드 수는 배포되는 환경의 리소스나 오픈서치 종류에따라 조정해야합니다 💪

아직 러스트 2~3개월차라 문법은 조금 어색할 수 있습니다 꾸준히 개선해나갈 예정입니다

많은 관심 부탁드려요 다양한 피드백도요~~~
감사합니다 🙇‍♂️