Rails와 AWS SNS/SQS를 활용한 마이크로서비스 구축 가이드

Microservices With Rails and SNS/SQS | by Arun Tekwani | Medium

작성자
jeff
발행일
2025년 06월 12일

핵심 요약

  • 1 Rails 애플리케이션에서 AWS SNS를 통해 이벤트를 발행하고 SQS를 통해 소비하는 마이크로서비스 아키텍처 구현 방법을 안내합니다.
  • 2 LocalStack을 활용하여 AWS SNS 및 SQS 환경을 로컬에서 구축하고, Rails 서비스 간 이벤트 기반 통신을 설정하는 과정을 상세히 설명합니다.
  • 3 UserService에서 사용자 생성 이벤트를 SNS로 발행하고 OrderService에서 SQS를 통해 이를 수신하여 처리하는 실용적인 예제를 제공합니다.

도입

이 문서는 Rails 애플리케이션을 마이크로서비스 아키텍처로 구현하기 위해 AWS의 Simple Notification Service (SNS)와 Simple Queue Service (SQS)를 연동하는 실용적인 가이드를 제공합니다. 특히, 개발 환경에서 AWS 서비스를 로컬에서 에뮬레이션할 수 있는 LocalStack을 활용하여 두 Rails 서비스 간에 이벤트 기반 통신을 설정하는 과정을 단계별로 설명하며, 효율적인 시스템 통합 방안을 제시합니다.

본 가이드는 UserServiceOrderService라는 두 개의 Rails 애플리케이션을 중심으로 마이크로서비스 연동을 시연합니다.

1. 개발 환경 설정

  • LocalStack 활용: Docker Compose를 사용하여 LocalStack을 실행하고, SNS 및 SQS 서비스를 로컬에 구축합니다. 이는 실제 AWS 환경 없이도 개발 및 테스트를 가능하게 합니다.
  • AWS CLI 설정: setup.sh 스크립트를 통해 user-events SNS 토픽과 order-service-queue SQS 큐를 생성하고, SQS 큐를 SNS 토픽에 구독시켜 이벤트 흐름을 준비합니다.

2. UserService 구현

  • 이벤트 발행: user_service Rails 앱에 aws-sdk-sns Gem을 추가하고, User 모델의 after_create 콜백에서 user.created 이벤트를 JSON 형식으로 직렬화하여 SNS 토픽으로 발행합니다.
  • AWS 설정: dotenv-rails를 사용하여 AWS 엔드포인트와 SNS 토픽 ARN을 환경 변수로 관리하며, config/initializers/aws.rb에서 AWS SDK를 초기화합니다.

3. OrderService 구현

  • 이벤트 소비: order_service Rails 앱에 aws-sdk-sqs Gem을 추가하고, SqsConsumerJob을 생성하여 SQS 큐에서 메시지를 주기적으로 폴링합니다.
  • 데이터 동기화: 수신된 user.created 이벤트 메시지를 파싱하여 OrderService의 로컬 User 모델에 사용자 정보를 생성하거나 업데이트합니다. 메시지 처리 후에는 SQS 큐에서 해당 메시지를 삭제합니다.
  • 스케줄링: whenever Gem을 사용하여 SqsConsumerJob이 매분 실행되도록 Cron 작업을 설정하여 자동화된 이벤트 처리를 구현합니다.

4. SNS와 SQS의 역할

  • SNS (Simple Notification Service): 발행/구독(pub/sub) 모델의 메시징 서비스로, 메시지를 토픽에 발행하면 모든 구독자에게 전달됩니다. user.created와 같은 이벤트를 여러 서비스에 동시에 알리는 데 적합합니다.
  • SQS (Simple Queue Service): 메시지 큐잉 서비스로, 메시지를 저장하고 단일 소비자에게 전달합니다. 메시지는 처리 및 삭제될 때까지 큐에 유지되며, OrderService와 같이 특정 작업을 처리하는 데 사용됩니다.

결론

본 가이드를 통해 개발자는 Rails 환경에서 AWS SNS와 SQS를 활용하여 강력하고 확장 가능한 마이크로서비스 아키텍처를 구축하는 방법을 이해할 수 있습니다. LocalStack을 통한 로컬 개발 환경 구성은 실제 AWS 비용 부담 없이 효율적인 개발 및 테스트를 가능하게 하며, 이벤트 기반 통신을 통해 서비스 간의 느슨한 결합을 달성하여 시스템의 유연성과 복원력을 향상시킵니다. 이러한 접근 방식은 복잡한 분산 시스템을 효과적으로 관리하는 데 필수적인 전략입니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!