<aside> 💡
주요 고려사항
→ 익숙하게 다루었던 기술 위주로 구성
→ 추가 비용을 최소화하도록 구성
→ 저장된 데이터 쿼리 편리성을 위해 RDBMS에 저장 (필요시 추후 마이그레이션)
</aside>
개별 로그를 Redis Stream
에 저장하는 API
<aside> 🚧
MySQL에 개별 삽입을 하는 것은 비효율적인 쿼리이며, 실시간으로 이루어지기 때문에 DB 서버 자원을 많이 소모하여 서비스 사용자에게 영향을 미칠 수 있다
</aside>
특정 날짜 하루 동안 Redis Stream
에 저장된 모든 로그를 Mysql
데이터베이스에 BULK INSERT하는 API
<aside> ⚠️
벌크 삽입 쿼리가 파라미터 바인딩을 사용하고, DB 드라이버가 패킷 분할을 지원하여 쿼리 전체 크기가 max_allowed_packet
(기본 64MB)을 초과하여도 정상 작동
파라미터 바인딩을 사용하면 쿼리 템플릿과 실제 데이터가 분리되어 전송
max_allowed_packet
을 넘지 않는 한, 여러 Row로 구성된 패킷으로 쪼개어 전송 가능파라미터 바인딩을 하지 않고 쿼리 전체가 하나의 문자열이라면 쪼개서 보낼 수 없어 max_allowed_packet
초과 시 전송 불가
max_allowed_packet
초과 시 전송 불가
</aside>SQLAlchemy 모델
Aws Eventbridge Scheduler
가 하루 한번 사용자가 가장 적은 시간대에 Aws Lambda
비동기 호출반복 일정 → cron 기반 일정
람다 호출 시 페이로드 설정
// 람다 호출하는 시점의 데이터을 동적으로 전달
{
"scheduled_time": "<aws.scheduler.scheduled-time>"
}
// 예시
{
"scheduled_time": "2024-01-01T06:00:00Z"
}
Aws Lambda
에서 로그 저장 서버의 배치 저장 API 호출requests
라이브러리를 사용해 동기적으로 API를 호출하기 때문에 제한시간 넉넉히 설정