0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Áp Dụng Microservices: Hướng Dẫn Mapping Dữ Liệu Giữa Các Dịch Vụ

Đăng vào 3 tuần trước

• 3 phút đọc

Chào các bạn, hôm nay chúng ta sẽ cùng bàn luận về một vấn đề thường gặp khi làm việc với kiến trúc microservices: đó chính là việc mapping dữ liệu giữa các dịch vụ. Nếu bạn đã từng phải đối mặt với công việc này, chắc hẳn bạn đã gặp nhiều thử thách. Ví dụ, trong dịch vụ A, bạn có thể lưu trữ userId trong một bảng nào đó, nhưng dữ liệu của người dùng lại nằm ở dịch vụ B. Để trả phản hồi cho phía client (Frontend), bạn cần cung cấp một số thông tin của người dùng như tên, email hoặc số điện thoại, thậm chí là các bảng liên quan đến bảng người dùng của dịch vụ B, ví dụ như additionalData. Việc mapping dữ liệu có thể tốn rất nhiều công sức. Khi chỉ có một số trường thì có thể bạn còn thấy dễ dàng, nhưng khi số lượng trường trở nên quá nhiều, hoặc có nhiều đối tượng lồng ghép, thì việc mapping thực sự trở thành một cơn ác mộng.

Để giải quyết vấn đề này, tôi muốn giới thiệu đến bạn một open source (OS) hữu ích có tên là Anemoi Open. OS này có bài hướng dẫn chi tiết trên Medium, nhưng để tránh spam, tôi sẽ không đính kèm link tại đây. Về cơ bản, OS này sử dụng phương pháp Attribute-based (Annotation-based) để thực hiện việc mapping dữ liệu. Phía dưới hoạt động theo mẫu mediator pattern kết hợp với request/reply pattern để triển khai quá trình biến đổi và mapping dữ liệu.

Dưới đây là một ví dụ minh họa:

csharp Copy
public sealed class OrganizationResponse : ModelResponse
{
    ...
    public string Name { get; set; }
    public string TaxCode { get; set; }
    public string ProvinceId { get; set; }
    [ProvinceOf(nameof(ProvinceId))] public string ProvinceName { get; set; }
    public string DistrictId { get; set; }
    [DistrictOf(nameof(DistrictId))] public string DistrictName { get; set; }
    ...
}

Trong ví dụ này, việc truy xuất dữ liệu ProvinceName và DistrictName trở nên rất đơn giản, chỉ cần thêm các Attribute như [ProvinceOf] hoặc [DistrictOf]. Nếu bạn không có dữ liệu ProvinceId, bạn vẫn có thể sử dụng cú pháp:

csharp Copy
public sealed class OrganizationResponse : ModelResponse
{
    ...
    public string Name { get; set; }
    public string TaxCode { get; set; }
    public string ProvinceId { get; set; }
    [DistrictOf(nameof(DistrictId), Expression = "Province.Name")] public string ProvinceName { get; set; }
    public string DistrictId { get; set; }
    [DistrictOf(nameof(DistrictId))] public string DistrictName { get; set; }
    ...
}

Trong đó, dữ liệu về tỉnh và quận được lưu trong MasterData như sau:

csharp Copy
public sealed class Province : ValueObject
{
    public ProvinceId Id { get; set; }
    public string Name { get; set; }
    ...
    public List<District> Districts { get; set; }
    protected override IEnumerable<object> GetEqualityComponents()
    {
        yield return Name;
    }
}

public sealed class District : ValueObject
{
    public DistrictId Id { get; set; }
    public ProvinceId ProvinceId { get; set; }
    public Province Province { get; set; }
    public string Name { get; set; }
    ...
    protected override IEnumerable<object> GetEqualityComponents()
    {
        yield return Name;
    }
}

Trên đây là một cái nhìn tổng quan về cách thức hoạt động của open source này. Trong các bài viết tiếp theo, tôi sẽ giải thích chi tiết hơn về cách thức mà Anemoi hoạt động và cách bạn có thể áp dụng nó vào dự án của mình.
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