Update
- 로컬 환경에서 동작할 수 있도록 변경하였습니다. 애플리케이션에서 활용하는 Queue를 AWS SQS 뿐만 아니라 Rabbit MQ도 추가하였습니다.(운용비용 절감 측면, 환경 다양성 지원)
- 이제 AWS 배포를 필수적으로 하지 않아도, 단순히 Docker Compose 환경에서 전체(Worker포함) 애플리케이션을 실행할 수 있습니다.(단 채점 서버 제외)
- 이에 따라 기존
libs/aws-sqs
라이브러리가 삭제되고libs/queue
라이브러리가 추가되었습니다. Nest.js 코드는 Strategy Pattern기반의 Custom Provider형태로 설계되어있습니다.
yarn docker:build yarn docker:up
- 위 추가사항에 따라 Nest.js Bootstrap Function(main.ts)에 변화가 있습니다. 설정한 환경에 맞게끔 Nest.js Webserver application 혹은 Nest.js Microservice application이 실행됩니다.
- WokerModule의 Controller는 AWS SQS Worker, Rabbit MQ Worker가 통합적으로 사용합니다.
- Elastic Beanstalk Worker는 기존처럼 Route를
POST /worker
로 지정하면 됩니다. - Rabbit MQ Worker는 Nest.js Microservice의
@MessagePattern
를 활용하여 Message 패턴에 따른 Handler가 정의됩니다.
- Elastic Beanstalk Worker는 기존처럼 Route를
.env
설정하기
무엇보다 변경된것은 .env
의 활용성입니다. Rabbit MQ Worker를 지원하면서 실행 애플리케이션의 설정값이 중요해졌습니다. 중요 필드는 TYPE
, QUEUE_TYPE
입니다.
AWS Environment
AWS 배포환경에서는 (Web server, Worker모두 포함) 각각 아래와 같이 설정해줍니다
TYPE="webserver"
...
QUEUE_TYPE="SQS"
...
이는 AWS Elastic Beanstalk Worker는 Webserver형태의 애플리케이션으로 Queue Item을 전송하기 때문입니다(Docs).
Docker Environment
Docker 환경에서는 Web server, Worker 각각 다른 설정을 해줘야 합니다. 각각의 값은 Bootstrap
과 WorkerModule
그리고 QueueModule
에 모두 영향을 주기 때문에, 애플리케이션 실행하기 전에 확인을 꼭 해주셔야합니다.
[ Webserver ]
TYPE="webserver"
...
QUEUE_TYPE="RMQ"
[ Worker ]
TYPE="worker"
...
QUEUE_TYPE="RMQ"
Next Update
다음 업데이트 사항은 Hashicorp Vault를 적용하는 것입니다. 관리해야하는 환경변수가 많아지고, 프런트엔드와 협업, 실제 배포환경에서 일관성과 키값 노출 방지를 위해서 Vault를 적용할 예정입니다.