Tình hình hiện tại
Chúng tôi đang triển khai (và hiện đang duy trì) một ứng dụng web mua sắm trực tuyến trong kiến trúc microservice.
Một trong những yêu cầu là doanh nghiệp phải có khả năng áp dụng các quy tắc về những gì khách hàng của chúng tôi thêm vào giỏ hàng của họ, để tùy chỉnh trải nghiệm của họ và thứ tự cuối cùng. Rõ ràng, một công cụ quy tắc kinh doanh phải được đưa ra và chúng tôi đã triển khai một "microservice" cụ thể cho việc này (nếu chúng tôi vẫn có thể gọi nó như vậy).
Trong suốt một năm, công cụ quy tắc này ngày càng phức tạp hơn, đòi hỏi ngày càng nhiều dữ liệu (ví dụ: nội dung của giỏ hàng mà còn thông tin người dùng, vai trò của anh ấy, dịch vụ hiện tại của anh ấy, một số thông tin thanh toán, v.v.) để có thể tính các quy tắc đó.
Hiện tại, shopping-cart
microservice của chúng tôi đang thu thập tất cả dữ liệu này từ các dịch vụ siêu nhỏ khác. Mặc dù một phần của dữ liệu này được sử dụng bởi shopping-cart
, phần lớn thời gian nó chủ yếu được sử dụng để cung cấp cho công cụ quy tắc.
Yêu cầu mới
Bây giờ cần đến các ứng dụng / dịch vụ siêu nhỏ khác để sử dụng lại công cụ quy tắc cho các yêu cầu tương tự. Do đó, trong tình huống hiện tại, họ sẽ phải truyền cùng loại dữ liệu, gọi cùng một dịch vụ siêu nhỏ và xây dựng (gần như) cùng một tài nguyên để có thể gọi công cụ quy tắc.
Tiếp tục như vậy, chúng tôi sẽ phải đối mặt với một số vấn đề:
- mọi người (gọi công cụ quy tắc) phải thực hiện lại việc tìm nạp dữ liệu, ngay cả khi họ không cần nó cho chính mình;
- các yêu cầu cho công cụ quy tắc là phức tạp;
- Tiếp tục theo hướng này, chúng tôi sẽ phải vận chuyển dữ liệu này trên toàn mạng cho nhiều yêu cầu (nghĩ đến việc gọi A gọi B là công cụ quy tắc, nhưng A đã có một số dữ liệu mà công cụ quy tắc cần);
shopping-cart
đã trở nên rất lớn do tất cả các dữ liệu tìm nạp;- Có lẽ tôi đã quên rất nhiều
Chúng ta có thể làm gì để tránh những rắc rối này?
Lý tưởng nhất, chúng tôi sẽ tránh thêm sự phức tạp hơn cho công cụ quy tắc. Chúng tôi cũng phải đảm bảo rằng nó không trở thành nút cổ chai - ví dụ: một số dữ liệu khá chậm để tìm nạp (10 giây hoặc thậm chí nhiều hơn) để chúng tôi triển khai tìm nạp trước shopping-cart
sao cho dữ liệu có nhiều khả năng ở đó trước khi chúng tôi gọi các quy tắc động cơ, và giữ một trải nghiệm người dùng chấp nhận được.
Một vài ý tưởng
- Hãy để công cụ quy tắc lấy dữ liệu cần thiết. Điều này sẽ làm tăng thêm sự phức tạp của nó, vi phạm nguyên tắc trách nhiệm duy nhất ( thậm chí nhiều hơn nữa );
- Triển khai proxy trước công cụ quy tắc để tìm nạp dữ liệu;
- Triển khai một "trình tải dữ liệu" mà công cụ quy tắc gọi để tìm nạp tất cả dữ liệu cần thiết cùng một lúc (truy vấn tổng hợp).
shopping-cart
, nhưng chúng tôi có thể dễ dàng điều chỉnh nó theo nhu cầu của các dịch vụ siêu nhỏ khác (chúng vẫn liên quan đến người dùng, sản phẩm và đặt hàng). Như chúng ta thấy, họ sẽ cần cùng một dữ liệu đầu vào, đặc biệt là khi doanh nghiệp có thể chọn các vị từ để áp dụng. Tất cả dữ liệu được cung cấp bởi các dịch vụ siêu nhỏ khác ngoại trừ chính nội dung giỏ hàng. Tìm nạp dữ liệu không phức tạp theo từng se nhưng nó trở nên phức tạp khi bạn phải gọi ~ 10 microservice khác và duy trì cấu trúc mà công cụ quy tắc mong đợi.