마이크로서비스 아키텍처는 소프트웨어 개발에 대한 한 접근 방식으로, 응용 프로그램을 작은, 독립적이며 느슨하게 결합된 서비스의 모음으로 구조화하며 이들 서비스는 API를 통해 서로 통신합니다.
마이크로서비스 아키텍처에서 각 서비스는 특정 비즈니스 기능이나 도메인에 대한 책임을 가지며 다른 서비스와 독립적으로 개발 및 배포될 수 있습니다.
이러한 서비스는 비즈니스 기능을 중심으로 구축되며 완전 자동화된 배포 프로세스에 의해 독립적으로 배포 가능합니다.
확장성: 각 서비스는 독립적으로 확장 가능하여 애플리케이션이 더 많은 트래픽과 부하를 처리할 수 있습니다.
민첩성: 마이크로서비스 아키텍처는 각 서비스가 독립적으로 개발, 테스트 및 배포될 수 있기 때문에 더 빠른 개발 주기를 가능케 합니다.
탄력성: 각 서비스가 독립적이기 때문에 한 서비스의 실패가 나머지 애플리케이션에 영향을 미치지 않을 수 있습니다.
유연성: 마이크로서비스는 각 서비스가 특정 요구 사항에 가장 적합한 기술을 사용하여 개발될 수 있기 때문에 더 많은 유연성을 제공합니다.
통합성: 각 서비스는 자체 API를 사용하여 제3자 서비스와 쉽게 통합될 수 있습니다.
이벤트 주도 아키텍처(Event Driven Architecture, EDA)는 소프트웨어 설계 방법으로, 시스템에서 발생하는 이벤트에 중점을 둔 구조입니다. 각각의 구성 요소는 비동기적으로 이벤트를 생성하고 수신하여 서로 간에 통신합니다. 마이크로서비스 아키텍처(Microservices Architecture, MSA)와 람다 아키텍처(Lambda Architecture)를 결합하는 것은 이벤트 주도 아키텍처를 효과적으로 구현하는 한 가지 방법입니다.
비동기 통신: 이벤트는 비동기적으로 발생하고 통신이 이루어집니다. 이로써 시스템의 각 부분은 독립적으로 동작할 수 있고, 확장성과 유연성이 향상됩니다.
이벤트 발생 및 구독: 시스템의 여러 구성 요소는 이벤트를 생성하고, 다른 요소들은 이벤트를 구독하여 특정 동작을 수행합니다. 이는 느슨한 결합을 갖게 하며, 각 구성 요소는 서로의 내부 구현을 몰라도 됩니다.
이벤트 스트림 처리: 이벤트는 스트림으로 처리되며, 시간에 따른 변화를 쉽게 추적할 수 있습니다. 이는 분석, 모니터링 및 디버깅에 유용합니다.
// orderService.ts
import { APIGatewayProxyHandler } from 'aws-lambda';
const orderHandler: APIGatewayProxyHandler = async (event) => {
try {
// 주문 처리 로직
const order_id = JSON.parse(event.body).order_id;
console.log(`Order processed for order_id: ${order_id}`);
return {
statusCode: 200,
body: JSON.stringify({ message: 'Order processed successfully!' }),
};
} catch (error) {
console.error('Error processing order:', error);
return {
statusCode: 500,
body: JSON.stringify({ message: 'Error processing order' }),
};
}
};
export { orderHandler };
// paymentService.ts
import { APIGatewayProxyHandler } from 'aws-lambda';
const paymentHandler: APIGatewayProxyHandler = async (event) => {
try {
// 결제 처리 로직
const order_id = JSON.parse(event.body).order_id;
console.log(`Payment processed for order_id: ${order_id}`);
return {
statusCode: 200,
body: JSON.stringify({ message: 'Payment processed successfully!' }),
};
} catch (error) {
console.error('Error processing payment:', error);
return {
statusCode: 500,
body: JSON.stringify({ message: 'Error processing payment' }),
};
}
};
export { paymentHandler };
이 코드에서는 두 개의 Lambda 함수(orderHandler 및 paymentHandler)가 주문 및 결제 서비스를 나타내고, 각각의 함수는 API Gateway를 통해 트리거될 것으로 가정합니다.
주문 서비스와 결제 서비스는 각자의 Lambda 함수로 독립적으로 배포되어 운영됩니다. 두 서비스는 서로 직접 통신하는 대신 이벤트를 통해 통신할 수도 있습니다. 이러한 형태로 마이크로서비스 아키텍처를 구성할 경우, 각 서비스는 자체적으로 확장 가능하며, 서비스 간의 결합도가 낮아져 유연한 시스템을 만들 수 있습니다.