목록 보기
서비스를 구체화 하는 방법
(Reducing Complexity in Service)
아키텍처

서비스를 구체화 하는 방법 (Reducing Complexity in Service)

야놀자클라우드
야놀자클라우드
2022년 7월 6일

두줄요약

에너지 현황 리포트 요구사항을 이벤트 기반 구조와 일 마감 배치로 구체화했습니다.\n비순차 이벤트·동시성·데이터 보존 문제를 MongoDB 잠금과 TTL로 관리했습니다.

문제 상황

  • GRMS의 IoT 장치·객실 이벤트를 기반으로 일별 에너지 사용량, 재실·체크인 상태별 낭비를 분석하는 리포트 요구
  • 비순차 이벤트 도착, 이벤트 유실, 연박 상태, 자정 기준 일별 집계와 동시성 제어 필요

구조와 흐름

  • Device·Space 서비스의 상태 변경 이벤트를 AWS SQS로 발행하고 Report 서비스가 구독하는 이벤트 기반 구조
  • 실시간 이벤트 처리로 장치별 사용 시간 이력 생성, 일 마감 배치로 연속 상태와 자정 구간 정리 후 일별 리포트 생성
  • 리포트·이력 데이터를 기반으로 조회, 역추적, 장애 관리 지원

선택 이유

  • 동기 HTTP 호출 대비 서비스 간 직접 의존성과 장애 전파를 낮추는 이벤트 기반 통신
  • 기존 AWS 환경의 비용·운영 편의성을 고려한 Document DB 선택
  • 모듈 관리 용이성에 따른 NestJS·TypeScript, 안정성과 레퍼런스를 고려한 TypeORM 선택

성능/운영 포인트

  • MongoDB의 findOneAndUpdate 원자성을 활용한 SpinLock과 JobNo 기반 DistLock으로 이벤트·배치 동시성 제어
  • TTL Index 기반 데이터 생명 주기 관리와 실패 배치의 다음 주기 재시도
  • 유닛 테스트와 E2E 테스트, 테스트용 API를 통한 시나리오 검증 및 커버리지 70% 이상 유지 목표

다음 읽기

비슷한 주제의 백엔드 글

달리는 서비스의 이벤트 버스 개선하기

비동기 메시지 규칙이 제각각이던 레거시 시스템을 통합 이벤트·커맨드·태스크로 분류해 표준화했습니다. Kafka와 Bullmq로 cloud agnostic 인프라를 구성해 CSAP 대응 마이그레이션을 완료했습니다.

모두싸인
모두싸인
백엔드

댓글 0개

댓글을 작성하려면 로그인이 필요합니다.

댓글을 불러오는 중...