모놀리식 아키텍처에서 이벤트 드리븐 아키텍처로
1. 한 주 동안 수행한 작업
예약 서비스 (Reservation Service)의 이벤트 드리븐 아키텍처로의 전환
- Kafka 설정 추가: Kafka 프로듀서와 컨슈머 설정을 추가하여 예약 서비스가 이벤트를 주고받을 수 있도록 준비.
- 이벤트 클래스 작성: ReservationRequestedEvent, SeatStatusUpdatedEvent, PaymentCompletedEvent 등 예약과 관련된 이벤트 클래스를 작성.
- 예약 요청 처리 변경: 예약 요청이 들어오면 ReservationRequestedEvent 이벤트를 Kafka를 통해 전송하도록 변경.
- 좌석 상태 업데이트 처리: SeatStatusUpdatedEvent 이벤트를 수신하여 좌석 상태를 업데이트하고 예약 상태를 변경.
- 결제 완료 이벤트 처리: PaymentCompletedEvent 이벤트를 수신하여 결제 성공 여부에 따라 예약 상태를 최종적으로 업데이트.
콘서트 서비스 (Concert Service)의 이벤트 드리븐 아키텍처로의 전환
- 예약 요청 이벤트 처리: ReservationRequestedEvent 이벤트를 수신하여 좌석 상태를 확인하고 업데이트.
- 좌석 상태 업데이트 이벤트 전송: 좌석 상태를 업데이트한 후 SeatStatusUpdatedEvent 이벤트를 Kafka를 통해 전송.
- 예약 실패 이벤트 처리: ReservationFailedEvent 이벤트를 수신하여 좌석 상태를 원래대로 복원.
- 콘서트 정보 요청 이벤트 처리: ConcertInfoRequestEvent 이벤트를 수신하여 콘서트 정보를 조회하고 응답 이벤트를 전송.
2. 작업의 필요성 및 이유
이벤트 드리븐 아키텍처로의 전환 필요성
- 확장성: 모놀리식 아키텍처에서는 하나의 애플리케이션이 모든 기능을 처리하므로, 애플리케이션의 성능과 확장성이 제한됩니다. 이벤트 드리븐 아키텍처를 도입하면 각 서비스가 독립적으로 동작하므로, 개별 서비스의 확장이 용이해집니다.
- 유지보수성: 모놀리식 아키텍처에서는 하나의 코드베이스에서 모든 기능이 구현되어 있어 코드의 복잡도가 높아지고, 유지보수가 어려워집니다. 서비스 분리를 통해 각 서비스의 코드베이스가 작아지고 명확해져 유지보수가 쉬워집니다.
- 유연성: 이벤트 드리븐 아키텍처에서는 서비스 간의 결합도가 낮아지므로, 새로운 기능을 추가하거나 변경할 때 다른 서비스에 미치는 영향이 적어집니다.
- 신뢰성: 이벤트 큐를 통해 비동기적으로 메시지를 주고받음으로써, 시스템 장애 시에도 메시지가 손실되지 않고, 복구 후 처리가 가능합니다.
3. 이전 아키텍처와의 차이점
모놀리식 아키텍처의 특징
- 단일 코드베이스: 모든 기능이 하나의 애플리케이션으로 구현되어 있습니다.
- 높은 결합도: 기능 간의 의존성이 높아, 변경이 다른 기능에 영향을 미칠 수 있습니다.
- 확장성 문제: 하나의 애플리케이션으로 모든 기능을 처리하기 때문에, 특정 기능의 부하가 전체 시스템에 영향을 미칩니다.
이벤트 드리븐 아키텍처의 특징
- 분산 서비스: 각 기능이 독립적인 서비스로 분리되어 있습니다.
- 낮은 결합도: 이벤트를 통해 서비스 간의 통신이 이루어지므로, 서비스 간의 의존성이 낮아집니다.
- 확장성 향상: 각 서비스가 독립적으로 확장 가능하므로, 특정 서비스의 부하가 전체 시스템에 영향을 미치지 않습니다.
장점
- 확장성: 개별 서비스 확장이 용이.
- 유지보수성: 서비스 별로 코드베이스가 작아져 유지보수가 쉬움.
- 유연성: 새로운 기능 추가 및 변경 시 다른 서비스에 영향이 적음.
- 신뢰성: 시스템 장애 시에도 메시지 손실이 적음.
단점
- 복잡성 증가: 서비스 간 통신을 위한 추가 설정 및 관리 필요.
- 데이터 일관성: 분산 시스템에서 데이터 일관성을 유지하기 위한 추가 작업 필요.
- 오버헤드: 이벤트 처리 및 메시지 큐 관리를 위한 오버헤드 발생.
4. 챌린지 해결을 위한 필요 사항
- 모니터링 및 로깅: 각 서비스의 상태를 모니터링하고 이벤트 흐름을 추적할 수 있는 도구 도입 필요.
- 트랜잭션 관리: 분산 트랜잭션을 관리하기 위한 Saga 패턴 등의 도입 필요.
- 데이터 일관성 유지: 이벤트 소싱 및 CQRS 패턴 등을 통해 데이터 일관성을 유지하기 위한 전략 필요.
- 성능 최적화: 이벤트 처리의 성능을 최적화하기 위한 Kafka 설정 및 튜닝 필요.
5. 앞으로 해야 할 일
- 테스트 및 검증: 각 서비스의 이벤트 흐름을 테스트하고, 예상치 못한 오류나 문제를 검증.
- 모니터링 도구 도입: 각 서비스의 상태 및 이벤트 흐름을 모니터링하기 위한 도구 도입 및 설정.
- 트랜잭션 관리: 분산 트랜잭션을 관리하기 위한 추가적인 패턴 및 도구 도입.
- 데이터 일관성 유지: 데이터 일관성을 유지하기 위한 추가적인 전략 도입.
- 성능 최적화: Kafka 및 각 서비스의 성능을 최적화하기 위한 추가적인 작업 수행.
6. 현재 당면한 기술 과제
- 이벤트 중복 처리: 이벤트가 중복 처리되지 않도록 하기 위한 추가적인 로직 필요.
- 데이터 일관성: 분산 환경에서 데이터 일관성을 유지하기 위한 추가적인 전략 필요.
- 서비스 간 통신: 서비스 간의 통신을 안정적으로 관리하기 위한 추가적인 설정 및 도구 필요.
- 모니터링 및 디버깅: 분산 환경에서 각 서비스의 상태를 모니터링하고 디버깅하기 위한 도구 및 설정 필요.