Cửa hàng của chúng tôi gần đây đã bắt đầu thực hiện một phương pháp tiếp cận SOA để phát triển ứng dụng. Chúng ta đang thấy một số lợi ích to lớn với việc phân tách các mối quan tâm, khả năng sử dụng lại và các lợi ích khác của SOA/microservices.Truy vấn/Pagination Across Microservices
Tuy nhiên, một lớn mục chúng tôi đang gặp phải là kết quả tổng hợp, lọc và phân trang giữa các dịch vụ. Hãy để tôi mô tả vấn đề với một kịch bản.
Giả sử chúng ta có 3 dịch vụ:
- PersonService - Cửa hàng thông tin về người (tên, địa chỉ, vv)
- ItemService - Cửa hàng thông tin về mặt hàng mà có thể mua.
- PaymentService - Lưu trữ thông tin về các khoản thanh toán mà mọi người đã thực hiện cho các mục khác nhau.
Bây giờ, giả sử chúng tôi muốn xây dựng công cụ báo cáo/quản trị có thể hiển thị/báo cáo trên nhiều dịch vụ tổng hợp. Ví dụ: chúng tôi muốn hiển thị danh sách Thanh toán được phân trang, cùng với Người và Mục mà mỗi khoản thanh toán đã cho. Điều này khá đơn giản: Lấy danh sách các khoản thanh toán, sau đó truy vấn PersonService và ItemService cho các bản ghi Person và Item tương ứng.
Tuy nhiên, vấn đề xảy ra khi chúng tôi muốn lọc dữ liệu đó: Ví dụ: hiển thị danh sách thanh toán được phân trang do những người có tên đầu tiên 'Bob' thực hiện, đã mua mặt hàng 'Xe hơi'. Điều này làm cho mọi thứ phức tạp hơn nhiều, bởi vì chúng ta cần lọc kết quả từ 3 dịch vụ khác nhau mà không biết có bao nhiêu kết quả mà mỗi dịch vụ sẽ trả về.
Từ góc độ hiệu suất, việc truy vấn tất cả các dịch vụ lặp đi lặp lại để thu hẹp kết quả sẽ tốn kém, vì vậy tôi đã nghiên cứu các giải pháp tốt hơn. Tuy nhiên, tôi không thể tìm thấy giải pháp cụ thể cho vấn đề này (hoặc ít nhất là một "thực hành tốt nhất"). Trong một ứng dụng nguyên khối, chúng ta chỉ cần sử dụng các phép nối SQL trên các bảng khác nhau. Tôi đang gặp phải rất nhiều khó khăn trong việc tìm ra cách thức/nếu có điều gì đó tương tự có thể xảy ra giữa các dịch vụ.
Câu hỏi của tôi đối với cộng đồng là: Cách tiếp cận của bạn sẽ là gì? Những điều tôi đã xem xét:
- Sử dụng một số loại chỉ mục tìm kiếm (Elasticsearch, Solr) có chứa tất cả dữ liệu cho tất cả các dịch vụ (cập nhật thông qua các sự kiện đẩy ra bởi dịch vụ), và sau đó truy vấn chỉ mục tìm kiếm cho kết quả.
- Cố gắng hiểu các dự án như thế nào GraphQL và Neo4j có thể hỗ trợ chúng tôi về những vấn đề này.
Chris Richardson có một số thông tin chi tiết về cơ sở dữ liệu trên mỗi dịch vụ chia sẻ cơ sở dữ liệu giữa các dịch vụ: http://microservices.io/patterns/data/database-per-service.html –