>백엔드 개발 >C++ >마이크로서비스의 사가 패턴

마이크로서비스의 사가 패턴

Patricia Arquette
Patricia Arquette원래의
2024-11-29 10:26:10914검색

The Saga Pattern in Microservices

안녕하세요 개발자 여러분,

마이크로서비스는 확장 가능하고 유연한 시스템을 구축하는 방식에 혁명을 일으켰습니다. 그러나 특히 서비스 전반에 걸쳐 분산 트랜잭션을 관리할 때 복잡성이 발생합니다. 이것이 바로 마이크로서비스에서 장기 실행 트랜잭션을 처리하기 위한 강력한 디자인 패턴인 사가 패턴이 등장하는 곳입니다. 이 게시물에서는 Saga Pattern이 무엇인지, 어떻게 작동하는지 살펴보고 C#의 HR(인적 자원) 사용 사례를 통해 실제로 어떻게 작동하는지 살펴보겠습니다.

사가 패턴이란 무엇입니까?

Saga 패턴은 대규모 분산 트랜잭션을 일련의 작은 단계로 나누고 각 단계는 특정 마이크로서비스에 의해 처리됩니다. 이러한 단계는 순서대로 실행되며, 문제가 발생할 경우 롤백하기 위해 각 단계에 대해 보상 작업이 정의됩니다.

사가 패턴을 구현하는 데는 두 가지 기본 접근 방식이 있습니다.

  1. 안무: 각 서비스는 이벤트를 듣고 반응하며 자체적으로 조정됩니다.
  2. 오케스트레이션: 중앙 코디네이터 서비스가 거래 흐름을 관리합니다.

Saga 패턴을 사용하는 이유는 무엇입니까?

Saga 패턴은 다음과 같은 마이크로서비스 아키텍처에 특히 유용합니다.

  • 거래는 다양한 서비스(예: HR, 급여, 채용)에 걸쳐 이루어집니다.
  • 확장성과 분리가 필수적입니다.
  • 부분적인 실패를 적절하게 처리하는 것이 중요합니다.

HR 사용 사례: 직원 온보딩

신규 직원 온보딩에 여러 마이크로서비스가 포함되는 HR(인적 자원) 시스템을 상상해 보세요.

  1. 사용자 서비스: 직원 계정을 생성합니다.
  2. 급여 서비스: 급여 세부사항을 설정합니다.
  3. 복리후생서비스: 직원의 복리후생을 등록합니다.

온보딩 프로세스를 완료하려면 이러한 서비스가 함께 작동해야 합니다. 급여 서비스가 실패하면 시스템에서 계정 생성 및 혜택 등록을 취소해야 합니다.

C에서 Saga 패턴 구현

직원 온보딩 프로세스를 오케스트레이션으로 사가 패턴을 구현해 보겠습니다.

1단계: Saga 코디네이터 정의

사가 코디네이터는 거래 흐름을 관리합니다. C#의 기본 구현은 다음과 같습니다.

public class SagaCoordinator
{
    private readonly IUserService _userService;
    private readonly IPayrollService _payrollService;
    private readonly IBenefitsService _benefitsService;

    public SagaCoordinator(IUserService userService, IPayrollService payrollService, IBenefitsService benefitsService)
    {
        _userService = userService;
        _payrollService = payrollService;
        _benefitsService = benefitsService;
    }

    public async Task ExecuteOnboardingSagaAsync(Employee employee)
    {
        try
        {
            Console.WriteLine("Starting onboarding saga...");

            // Step 1: Create user account
            await _userService.CreateUserAsync(employee);

            // Step 2: Set up payroll
            await _payrollService.SetupPayrollAsync(employee);

            // Step 3: Register benefits
            await _benefitsService.RegisterBenefitsAsync(employee);

            Console.WriteLine("Onboarding completed successfully!");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error during onboarding: {ex.Message}");
            await CompensateAsync(employee);
        }
    }

    private async Task CompensateAsync(Employee employee)
    {
        Console.WriteLine("Compensating...");
        await _benefitsService.RollbackBenefitsAsync(employee);
        await _payrollService.RollbackPayrollAsync(employee);
        await _userService.DeleteUserAsync(employee);
        Console.WriteLine("Compensation complete.");
    }
}

2단계: 서비스 정의

각 서비스는 특정 논리와 보상 조치를 구현합니다.

public interface IUserService
{
    Task CreateUserAsync(Employee employee);
    Task DeleteUserAsync(Employee employee);
}

public interface IPayrollService
{
    Task SetupPayrollAsync(Employee employee);
    Task RollbackPayrollAsync(Employee employee);
}

public interface IBenefitsService
{
    Task RegisterBenefitsAsync(Employee employee);
    Task RollbackBenefitsAsync(Employee employee);
}

이러한 인터페이스의 구현은 데이터베이스 또는 기타 API와 상호 작용합니다.

3단계: Saga 실행

Saga 코디네이터를 사용하는 방법은 다음과 같습니다.

public class SagaCoordinator
{
    private readonly IUserService _userService;
    private readonly IPayrollService _payrollService;
    private readonly IBenefitsService _benefitsService;

    public SagaCoordinator(IUserService userService, IPayrollService payrollService, IBenefitsService benefitsService)
    {
        _userService = userService;
        _payrollService = payrollService;
        _benefitsService = benefitsService;
    }

    public async Task ExecuteOnboardingSagaAsync(Employee employee)
    {
        try
        {
            Console.WriteLine("Starting onboarding saga...");

            // Step 1: Create user account
            await _userService.CreateUserAsync(employee);

            // Step 2: Set up payroll
            await _payrollService.SetupPayrollAsync(employee);

            // Step 3: Register benefits
            await _benefitsService.RegisterBenefitsAsync(employee);

            Console.WriteLine("Onboarding completed successfully!");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error during onboarding: {ex.Message}");
            await CompensateAsync(employee);
        }
    }

    private async Task CompensateAsync(Employee employee)
    {
        Console.WriteLine("Compensating...");
        await _benefitsService.RollbackBenefitsAsync(employee);
        await _payrollService.RollbackPayrollAsync(employee);
        await _userService.DeleteUserAsync(employee);
        Console.WriteLine("Compensation complete.");
    }
}

Saga 패턴의 장점

  1. 복원력: 장기 실행 프로세스의 오류 복구를 가능하게 합니다.
  2. 확장성: 트랜잭션 무결성을 유지하면서 서비스를 분리합니다.
  3. 유연성: 보상 로직을 맞춤화하여 다양한 워크플로우를 지원합니다.

최종 생각

Saga 패턴은 마이크로서비스와 같은 분산 시스템에서 데이터 일관성을 유지하는 데 중요한 디자인 패턴입니다. HR 예에서는 전체 온보딩 프로세스가 성공적으로 완료되거나 정상적으로 롤백되어 시스템 무결성이 유지되도록 했습니다.

Saga와 같은 패턴을 활용하여 분산 트랜잭션의 복잡성을 처리하는 강력한 시스템을 설계할 수 있습니다.

계속 코딩하세요

위 내용은 마이크로서비스의 사가 패턴의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.