Thiết kế microservice nhiều người thuê


13

Chúng tôi đang trong quá trình di chuyển một ứng dụng nguyên khối sang kiến ​​trúc microservice. Do một số yêu cầu quy định, chúng tôi phải giữ dữ liệu của khách hàng từ các quốc gia khác nhau trong cơ sở dữ liệu riêng biệt (quốc gia cụ thể). Tức là db Mỹ cho khách hàng Hoa Kỳ, db Anh cho khách hàng Vương quốc Anh ...

Các thiết kế sau đây mà chúng tôi đang xem xét như sau:

Tùy chọn 1: Một ứng dụng nhiều người thuê với sự hỗ trợ của nhiều người thuê ngủ đông có thể được thu nhỏ thành N số lần phụ thuộc vào nhu cầu (nghĩ về các nhóm kubernetes). Một phiên bản duy nhất của ứng dụng này sẽ có thể kết nối với tất cả các cơ sở dữ liệu.

Tùy chọn 2: Triển khai 1 phiên bản microservice cho mỗi cơ sở dữ liệu quốc gia. Với một cổng API ở phía trước chúng định tuyến lưu lượng

Nếu bạn thiết kế loại hệ thống này, lựa chọn của bạn là gì?


3
Tôi nghĩ rằng nó sẽ phụ thuộc vào các yêu cầu chức năng và phi chức năng cụ thể của bạn là gì.
Robert Harvey

Cơ sở dữ liệu khác nhau nhưng cùng một ví dụ đang đọc nó? Điều đó có vi phạm các yêu cầu quy định quá không?
Jimmy T.

Tùy chọn 1 dường như không quá phù hợp với kiểu kiến ​​trúc microservice.
Laiv

Bạn đề cập đến Kebernetes nhưng không rõ liệu bạn có đang sử dụng container hay không. Nếu bạn đang làm điều này với Docker (ví dụ), bạn chỉ cần tạo một ứng dụng kết nối với cơ sở dữ liệu. Sau đó, khi bạn khởi động container và chỉ định chi tiết kết nối thông qua các tham số và / hoặc cấu hình. Có một ứng dụng kết nối với nhiều cơ sở dữ liệu giống như chỉ tạo ra các vấn đề tiềm năng. Nó không thêm bất cứ điều gì tốt cho thiết kế.
JimmyJames

Câu trả lời:


4

Tôi nghĩ rằng tùy chọn 2 không phải là một lựa chọn tồi, nhưng có thể không cần thiết. Các dịch vụ vi mô là để cho phép bạn giải quyết nhu cầu của nhiều ứng dụng.

Một yếu tố lớn ở đây, là nếu có bất kỳ sự khác biệt giữa hai lược đồ, và nếu có bao giờ sẽ có trong tương lai.

Thông thường, tôi nghĩ rằng sử dụng giao diện cho các kho lưu trữ là không cần thiết; tuy nhiên, nó có thể là giá trị nỗ lực trong trường hợp này. Các nhà máy lưu trữ sẽ rất quan trọng đối với bạn.

Vấn đề của tôi với tùy chọn 1 là nó quá cụ thể. Bạn sẽ có thể đi từ thiết lập mà bạn đã mô tả, đến hai trường hợp riêng biệt, mỗi trường hợp chỉ đến DB của chính nó một cách dễ dàng. Ứng dụng KHÔNG nên CHĂM SÓC Ở ĐÂU KHI NHẬN ĐƯỢC DỮ LIỆU.

Mặc dù lược đồ không khác nhau đối với hai cơ sở dữ liệu khác nhau của bạn, bạn có thể có một kho lưu trữ dễ dàng xử lý cả hai mà không cần ứng dụng biết sự khác biệt:

public class MyEntityRepository : ISavesMyEntity, IGetsMyEntity
{
    public MyEntityRepository(string connectionString)
    {
       _connectionString = connectionString;
    }
}

public class MyEntitySaverFactory
{
    public ISavesMyEntity GetSaver(User user)
    {
        if (user.IsUK)
            return new MyEntityRepository(Config.Get("UKConnString"));
        if (user.IsUS)
            return new MyEntityRepository(Config.Get("USConnString"));
        throw new NotImplementedException();
    }
}

//USE
ISavesMyEntity saver = factory.GetSaver(currentUser);
saver.Save(myEntityInstance);

Nếu các lược đồ DB trở nên khác biệt giữa Hoa Kỳ và Vương quốc Anh, thì bạn sẽ chia chức năng thành hai kho hoàn toàn khác nhau. Điều này sẽ dễ dàng, vì tất cả những gì bạn sẽ phải làm là thay đổi nhà máy của bạn.


1
Tôi không hiểu tại sao bạn cần nhà máy này. Tại sao không chuyển qua đường dẫn đến chi tiết cấu hình khi khởi động? Với điều này, bạn cần sửa đổi mã mỗi lần bạn muốn thêm một vùng / quốc gia mới.
JimmyJames

1
Vấn đề ở đây không phải là giao dịch với người dùng ở các quốc gia riêng biệt ... mà là giao dịch với các cơ sở dữ liệu khác nhau. Nếu có các lược đồ khác nhau thì sao? Tại sao lớp tiêu thụ phải chịu trách nhiệm tìm ra nơi lấy chuỗi kết nối DB?
TheCatWhisperer

Tôi không biết ý của bạn là gì. Không có gì trong mã phải chịu trách nhiệm 'tìm ra' nơi nhận chuỗi kết nối. Đó là cấu hình. Tôi không thấy lý do tại sao điều này khác với việc sử dụng cấu hình cho cơ sở dữ liệu QA so với sản xuất. Bạn không đặt câu lệnh trong mã cho điều đó, phải không?
JimmyJames

Đây là một ứng dụng nói chuyện với hai cơ sở dữ liệu.
TheCatWhisperer

Tôi nghĩ rằng bạn hiểu sai vấn đề: "chúng tôi phải giữ dữ liệu của khách hàng từ các quốc gia khác nhau trong cơ sở dữ liệu riêng biệt (quốc gia cụ thể)" Không có yêu cầu cho một "ví dụ" ứng dụng duy nhất để nói chuyện với hai cơ sở dữ liệu. Tôi nghi ngờ đó chỉ là hai DB. OP có lẽ có nghĩa là "vd" khi họ gõ "tức là"
JimmyJames

0

Tôi sẽ đi với tùy chọn thứ hai, nó cho ít ma sát hơn trong phát triển và triển khai.

Điều này sẽ cho phép khả năng mở rộng và tính sẵn sàng tốt hơn và các tùy chọn triển khai thời gian chết không tốt hơn, khi bạn phân phối ứng dụng của mình cho 1 (hoặc ít nhất một) cho mỗi khu vực, trái ngược với ít nhất một cho toàn thế giới.

Khi các yêu cầu thay đổi, bạn có thể có logic kinh doanh cụ thể theo vùng hơn và cũng có thể thay đổi dữ liệu, tôi sẽ thử phân tách mã và dữ liệu theo từng vùng và tránh chia sẻ logic kinh doanh cụ thể theo vùng (cuối cùng bạn có thể chia sẻ một số mã lõi).

Có lý?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.