2016-12-01 16 views
8

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ụ:

  1. PersonService - Cửa hàng thông tin về người (tên, địa chỉ, vv)
  2. ItemService - Cửa hàng thông tin về mặt hàng mà có thể mua.
  3. 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:

  1. 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ả.
  2. Cố gắng hiểu các dự án như thế nào GraphQLNeo4j có thể hỗ trợ chúng tôi về những vấn đề này.
+0

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 –

Trả lời

2

tôi gắn bó với Sam Newman người nói tại Chương 4 "Cơ sở dữ liệu được chia sẻ" một cái gì đó cuốn sách của ông như:

Ghi khi chúng ta nói về các nguyên tắc cốt lõi đằng sau microservices tốt? Sự gắn kết mạnh mẽ và khớp nối lỏng lẻo - với sự tích hợp cơ sở dữ liệu, chúng tôi mất cả hai thứ. Tích hợp cơ sở dữ liệu làm cho nó rất dễ dàng cho các dịch vụ chia sẻ dữ liệu, nhưng không có gì về việc chia sẻ hành vi.Đại diện nội bộ của chúng tôi được tiếp xúc trên dây cho người tiêu dùng của chúng tôi, và nó có thể rất khó khăn để tránh làm thay đổi phá vỡ, mà chắc chắn dẫn đến sợ hãi của bất kỳ thay đổi ở tất cả. Tránh tại (gần) tất cả các chi phí.

Đây là điểm tôi thực hiện khi tôi nguyền rủa tại Hệ thống quản lý nội dung.

Theo quan điểm của tôi, dịch vụ microservice là tự trị, điều không thể là nếu nó chia sẻ mọi thứ hoặc tiêu thụ những thứ được chia sẻ. Ngoại lệ duy nhất tôi tạo ra ở đây là các đối tượng miền, những đối tượng đại diện cho sự hiểu biết chung về mô hình kinh doanh và chỉ được sử dụng trong giao tiếp giữa các microservices.

Tùy thuộc vào bản thân dịch vụ microservice nếu cơ sở dữ liệu ER hoặc AggregationOriented (được chia thành dựa trên tài liệu hoặc dựa trên biểu đồ) phù hợp hơn với nhu cầu. Điều thú vị là, bằng cách được loosley kết hợp và bằng cách tự trị, bạn có thể làm điều đó!

Nếu một dịch vụ thanh toán chia sẻ hành vi "số tiền thanh toán cho người A" , anh ấy cần biết Người A để thực hiện việc này. Nhưng mọi thứ mà anh ta biết về Person A phải có nguồn gốc từ PersonService, có thể là thời gian chạy (PaymentService có thể chỉ lưu trữ một id) hoặc sự kiện dựa trên (PaymentService lưu trữ dữ liệu cần thiết cho người dùng Domain-Object, những gì được cập nhật được kích hoạt và cung cấp bởi PersonService). Bản thân dịch vụ PaymentService không tự chia sẻ với người dùng.

Các vấn đề liên quan