- 이것으로 to-do 애플리케이션의 아키텍처를 이벤트 지향 아키텍처(event-driven architecture)로 변경했다.
- 이벤트 지향 아키텍처:
- 애플리케이션이 모든 일을 즉각 동기적으로 처리하는 대신 이벤트를 통해 다른 구성 요소에 자신의 현재 상태를 알리는 방식
- 이벤트를 발행하는 로직을 변경하지 않고도 이벤트 처리 로직을 바꿀 수 있으므로 애플리케이션의 구성 요소 간 결합도를 느슨하게 하는 효과가 있다
- 지금은 이벤트를 한 가지만 사용하지만, 이것만으로도 기존 애플리케이션을 변경하지 않고 새 기능을 추가 할 수 있는 유연성을 갖추고 있다.
- 새 기능을 추가하는 가장 쉬운 방법은 새로운 메시지 핸들러의 그룹을 만들고 모든 메시지를 수신하도록 하되 이벤트 처리를 다르게 하는 것이다.
실습 새 메시지 핸들러는 컴포즈 오버라이드 파일에 정의된다. 이 컴포즈 파일을 배포하면 컴포넌트가 애플리케이션에 추가된다. 컨테이너가 하나 추가되는 것 외에 기존 컨테이너의 변경은 없다.
- 새로운 메시지 핸들러는 데이터를 일래스틱서치에 저장해 키바나에서 그 내용을 검색하게 할 수도 있고, 새 할 일을 구글 캘린더에 추가할 수도 있다.
- 새로 추가되는 할 일의 내용을 컨테이너 로그로 출력하는 간단한 메시지 핸들러이다.
# 동작 확인 핸들러를 실행한다. 개수는 메시지 저장 핸들러와 동일하다
➜ docker-compose -f docker-compose.yml -f docker-compose-audit.yml up -d --scale save-handler=3
# 동작 확인 핸들러가 메시지를 수신하는지 확인
➜ docker logs todo-list-audit-handler-1
Connecting to message queue url: nats://message-queue:4222
Listening on subject: events.todo.newitem, queue: audit-handler
# 웹 브라우저에서 http://localhost:8080 에 접근해 새로운 할 일 추가
# 동작 여부 확인
➜ docker logs todo-list-audit-handler-1
AUDIT @ 08/20/2023 05:14:03: ccc
- 이번 배포는 무중단 배포다.
- 기존 컨테이너의 변경은 없고, 새 기능은 새 컨테이너로 구현됐다.
- 애플리케이션에서 핵심 이벤트를 메시지 큐에 발행하기만 하면, 기존 컴포넌트를 수정하지 않고도 새로운 기능을 추가할 수 있다.
- 이 기능에 문제가 생긴다면 해당 메시지 핸들러만 증단 시키면 된다.
실습 to-do 목록 API도 이미 구현이 끝나 바로 배포할 수 있다. 이 API는 8081번 포트를 주시하며 사용자가 HTTP POST 요청을 보내면 새 할 일 이벤트를 발행한다.
# 컴포즈 오버라이드 파일에 정의된 API 컨테이너 실행
➜ docker-compose -f docker-compose.yml -f docker-compose-audit.yml -f docker-compose-api.yml up -d todo-api
# API를 사용해 새 할 일 추가
➜ curl http://localhost:8081/todo -d '{"item":"ddd"}' -H 'Content-Type: application/json'
# 동작 확인 로그 확인
➜ docker logs todo-list-audit-handler-1
AUDIT @ 08/20/2023 05:19:52: ddd
- 이 API의 실체는 HTTP 서버다. 그리고 이 API에 포함된 실제 로직은 메시지 큐에 이벤트를 발행하는 것뿐이다.
- 로그를 확인하면 API로 입력된 새 할 일이 동작 확인 핸들러와 메시지 저장 핸들러에서 처리되는 것을 볼 수 있다.