0
0
Lập trình
Sơn Tùng Lê
Sơn Tùng Lê103931498422911686980

Giải pháp cho bài toán giao dịch phân tán trong Microservices bằng cách sử dụng Saga Pattern

Đăng vào 1 tháng trước

• 4 phút đọc

Chủ đề:

Microservices

Giải pháp cho bài toán giao dịch phân tán trong Microservices bằng cách sử dụng Saga Pattern

Microservices đã mang đến một cuộc cách mạng trong việc phát triển hệ thống linh hoạt và mở rộng. Tuy nhiên, nó cũng đi kèm với những thách thức trong việc quản lý các giao dịch phân tán giữa các dịch vụ. Saga Pattern được xem là giải pháp hiệu quả để giải quyết vấn đề này.

Mô hình Saga là gì?

Saga Pattern hoạt động bằng cách chia một giao dịch lớn thành nhiều bước nhỏ hơn, trong đó mỗi bước sẽ được xử lý bởi một microservice cụ thể. Điều đặc biệt ở Saga Pattern là khả năng xác định các hành động bù trừ cho mỗi bước, cho phép khôi phục hệ thống về trạng thái ban đầu khi có lỗi xảy ra.

Có hai phương pháp chính trong việc triển khai Saga Pattern:

  1. Choreography: Mỗi dịch vụ lắng nghe và phản ứng dựa trên các sự kiện.
  2. Orchestration: Sử dụng một dịch vụ điều phối trung tâm để quản lý luồng giao dịch.

Khi nào nên sử dụng mô hình Saga?

Saga Pattern rất hữu ích trong các kiến trúc microservices khi các giao dịch trải dài qua nhiều dịch vụ. Khả năng xử lý lỗi và duy trì tính tách biệt giữa các dịch vụ là rất quan trọng. Một ví dụ tiêu biểu là quy trình onboarding nhân viên mới trong hệ thống quản lý nhân sự.

Quá trình này thường liên quan đến nhiều microservices như dịch vụ quản lý người dùng (tạo tài khoản), dịch vụ quỹ lương (thiết lập chi tiết lương) và dịch vụ phúc lợi (đăng ký phúc lợi). Nếu dịch vụ quỹ lương gặp lỗi, hệ thống cần phải hoàn tác việc tạo tài khoản và đăng ký phúc lợi một cách liên tục.

Triển khai mẫu Saga trong C#

Để triển khai Saga Pattern với phương pháp Orchestration trong C#, ta cần một Saga Coordinator - thành phần quản lý luồng giao dịch. Đối với mỗi dịch vụ (Dịch vụ Người dùng, Dịch vụ Lương, Dịch vụ Phúc lợi), cần có logic riêng và các hành động bù trừ tương ứng. Sau đó, Saga Coordinator sẽ thực thi toàn bộ quy trình onboarding.

Bước 1: Xác định Saga Coordinator

Saga Coordinator là phần quan trọng trong việc quản lý luồng giao dịch. Dưới đây là một triển khai cơ bản trong C#:

csharp Copy
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("Bắt đầu quy trình onboarding...");

            // Bước 1: Tạo tài khoản người dùng
            await _userService.CreateUserAsync(employee);

            // Bước 2: Thiết lập quỹ lương
            await _payrollService.SetupPayrollAsync(employee);

            // Bước 3: Đăng ký phúc lợi
            await _benefitsService.RegisterBenefitsAsync(employee);

            Console.WriteLine("Quy trình onboarding hoàn tất thành công!");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Lỗi trong quá trình onboarding: {ex.Message}");
            await CompensateAsync(employee);
        }
    }

    private async Task CompensateAsync(Employee employee)
    {
        Console.WriteLine("Đang hoàn tác...");
        await _benefitsService.RollbackBenefitsAsync(employee);
        await _payrollService.RollbackPayrollAsync(employee);
        await _userService.DeleteUserAsync(employee);
        Console.WriteLine("Quá trình hoàn tác đã hoàn tất.");
    }
}

Bước 2: Xác định các dịch vụ

Mỗi dịch vụ cần triển khai logic và hành động bù trừ riêng của nó:

csharp Copy
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);
}

Bước 3: Thực hiện Saga

Dưới đây là cách bạn có thể sử dụng Saga Coordinator:

csharp Copy
var sagaCoordinator = new SagaCoordinator(userService, payrollService, benefitsService);
await sagaCoordinator.ExecuteOnboardingSagaAsync(new Employee { Name = "John Doe" });

Kết luận

Saga Pattern cho phép quản lý một cách hiệu quả các giao dịch phức tạp trong hệ thống microservices, giúp đảm bảo tính toàn vẹn dữ liệu và khả năng phục hồi từ lỗi trong suốt quy trình. Điều này làm cho nó trở thành một công cụ thiết yếu cho các kiến trúc hệ thống phân tán hiện đại. Dù quy trình có kéo dài hay phức tạp, Saga Pattern vẫn đảm bảo rằng mọi quy trình onboarding sẽ thành công hoặc sẽ được khôi phục an toàn, duy trì tính toàn vẹn tổng thể của hệ thống.
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào