Micro Service Architecture

ian·2023년 9월 23일
0

Micro Service Architecture

MSA

마이크로서비스 아키텍처는 소프트웨어 개발에 대한 한 접근 방식으로, 응용 프로그램을 작은, 독립적이며 느슨하게 결합된 서비스의 모음으로 구조화하며 이들 서비스는 API를 통해 서로 통신합니다.

마이크로서비스 아키텍처에서 각 서비스는 특정 비즈니스 기능이나 도메인에 대한 책임을 가지며 다른 서비스와 독립적으로 개발 및 배포될 수 있습니다.

이러한 서비스는 비즈니스 기능을 중심으로 구축되며 완전 자동화된 배포 프로세스에 의해 독립적으로 배포 가능합니다.

언제 사용하는가?

  • 대규모 프로젝트 또는 기업급 애플리케이션을 개발하고 확장해야 할 때
  • 다양한 기술 스택을 활용해야 하거나, 개발팀 간의 독립성을 유지해야 할 때
  • 장애 격리와 확장성이 중요한 경우, 미래에 추가적인 기능과 서비스를 유연하게 통합해야 할 때

장점

확장성: 각 서비스는 독립적으로 확장 가능하여 애플리케이션이 더 많은 트래픽과 부하를 처리할 수 있습니다.
민첩성: 마이크로서비스 아키텍처는 각 서비스가 독립적으로 개발, 테스트 및 배포될 수 있기 때문에 더 빠른 개발 주기를 가능케 합니다.
탄력성: 각 서비스가 독립적이기 때문에 한 서비스의 실패가 나머지 애플리케이션에 영향을 미치지 않을 수 있습니다.
유연성: 마이크로서비스는 각 서비스가 특정 요구 사항에 가장 적합한 기술을 사용하여 개발될 수 있기 때문에 더 많은 유연성을 제공합니다.
통합성: 각 서비스는 자체 API를 사용하여 제3자 서비스와 쉽게 통합될 수 있습니다.

Event Driven Architecture

이벤트 주도 아키텍처(Event Driven Architecture, EDA)는 소프트웨어 설계 방법으로, 시스템에서 발생하는 이벤트에 중점을 둔 구조입니다. 각각의 구성 요소는 비동기적으로 이벤트를 생성하고 수신하여 서로 간에 통신합니다. 마이크로서비스 아키텍처(Microservices Architecture, MSA)와 람다 아키텍처(Lambda Architecture)를 결합하는 것은 이벤트 주도 아키텍처를 효과적으로 구현하는 한 가지 방법입니다.

이벤트 주도 아키텍처 (EDA)의 특징

비동기 통신: 이벤트는 비동기적으로 발생하고 통신이 이루어집니다. 이로써 시스템의 각 부분은 독립적으로 동작할 수 있고, 확장성과 유연성이 향상됩니다.

이벤트 발생 및 구독: 시스템의 여러 구성 요소는 이벤트를 생성하고, 다른 요소들은 이벤트를 구독하여 특정 동작을 수행합니다. 이는 느슨한 결합을 갖게 하며, 각 구성 요소는 서로의 내부 구현을 몰라도 됩니다.

이벤트 스트림 처리: 이벤트는 스트림으로 처리되며, 시간에 따른 변화를 쉽게 추적할 수 있습니다. 이는 분석, 모니터링 및 디버깅에 유용합니다.

람다(Lambda)를 활용한 MSA 예시

// 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 함수로 독립적으로 배포되어 운영됩니다. 두 서비스는 서로 직접 통신하는 대신 이벤트를 통해 통신할 수도 있습니다. 이러한 형태로 마이크로서비스 아키텍처를 구성할 경우, 각 서비스는 자체적으로 확장 가능하며, 서비스 간의 결합도가 낮아져 유연한 시스템을 만들 수 있습니다.

profile
Backend Developer

0개의 댓글