Microservices và kết hợp cơ sở dữ liệu


112

Đối với những người đang chia tách các ứng dụng nguyên khối thành các microservices, bạn sẽ xử lý vấn đề hóc búa như thế nào khi tách rời cơ sở dữ liệu. Các ứng dụng điển hình mà tôi đã làm việc tích hợp nhiều cơ sở dữ liệu vì lý do hiệu suất và tính đơn giản.

Nếu bạn có hai bảng khác biệt về mặt logic (bối cảnh giới hạn nếu bạn muốn) nhưng bạn thường xử lý tổng hợp trên một lượng lớn dữ liệu đó thì trong nguyên khối, bạn có nhiều khả năng tránh hướng đối tượng và thay vào đó sử dụng tiêu chuẩn cơ sở dữ liệu của mình Tính năng JOIN để xử lý dữ liệu trên cơ sở dữ liệu trước khi đưa chế độ xem tổng hợp trở lại cấp ứng dụng của bạn.

Làm thế nào để bạn biện minh cho việc chia nhỏ dữ liệu đó thành các microservices trong đó có lẽ bạn sẽ được yêu cầu 'nối' dữ liệu thông qua một API thay vì tại cơ sở dữ liệu.

Tôi đã đọc cuốn sách Microservices của Sam Newman và trong chương về tách Monolith, anh ấy đưa ra một ví dụ về "Phá vỡ các mối quan hệ chính đối ngoại", nơi anh ấy thừa nhận rằng thực hiện liên kết trên một API sẽ chậm hơn - nhưng anh ấy tiếp tục nói nếu ứng dụng của bạn dù sao cũng đủ nhanh, liệu nó có chậm hơn trước không?

Điều này có vẻ hơi lấp lánh? Kinh nghiệm của mọi người là gì? Bạn đã sử dụng những kỹ thuật nào để làm cho các phép nối API hoạt động ở mức chấp nhận được?


2
Câu hỏi hay, tôi đang gặp vấn đề tương tự và cuối cùng tôi đã có một cái nhìn cụ thể hóa và thực hiện tham gia vào vấn đề đó. Tôi không thích nó, nhưng tôi đoán đó sẽ là một thách thức với Dịch vụ vi mô. Không có cách nào đúng để làm điều này, nó chỉ là sự lựa chọn thiết kế để thực hiện. Tôi biết nhiều người nói rằng chúng ta có thể có một cái nhìn cụ thể, nhưng các phản hồi tổng hợp lại trở thành một vấn đề. Hãy cho tôi biết nếu bạn tìm thấy thứ gì đó tốt hơn.
PavanSandeep 14/09/16

Tôi biết điều này đã cũ, nhưng, đây có phải là thứ mà graphql giải quyết được không? Tôi cũng đang xem xét điều này cho một quá trình di chuyển được phân đoạn và có vẻ như graphql là cách để làm cho việc này trở nên liền mạch.
themightybun

Đến một lúc nào đó, bạn sẽ nhận ra rằng trở nên giáo điều không phải là cách để đi. GraphQL là một ví dụ điển hình về việc tổng hợp bên ngoài nguồn dữ liệu và nó thường hoạt động tốt.
Christian Ivicevic

Câu trả lời:


26
  • Khi hiệu suất hoặc độ trễ không quá quan trọng (vâng, chúng tôi không phải lúc nào cũng cần chúng), bạn chỉ cần sử dụng các API RESTful đơn giản để truy vấn dữ liệu bổ sung mà bạn cần. Nếu bạn cần thực hiện nhiều cuộc gọi đến các microservices khác nhau và trả về một kết quả, bạn có thể sử dụng mẫu API Gateway .

  • Hoàn toàn tốt khi có dự phòng trong các môi trường liên tục Polyglot . Ví dụ: bạn có thể sử dụng hàng đợi nhắn tin cho microservices của mình và gửi các sự kiện "cập nhật" mỗi khi bạn thay đổi điều gì đó. Các microservices khác sẽ lắng nghe các sự kiện cần thiết và lưu dữ liệu cục bộ. Vì vậy, thay vì truy vấn, bạn giữ tất cả dữ liệu cần thiết trong bộ nhớ thích hợp cho microservice cụ thể.

  • Ngoài ra, đừng quên về bộ nhớ đệm :) Bạn có thể sử dụng các công cụ như Redis hoặc Memcached để tránh truy vấn các cơ sở dữ liệu khác quá thường xuyên.


25
Tất cả các đề xuất tốt, nhưng tôi vẫn thấy khó hợp lý hóa, Có lẽ đó là vì chúng ta đã quá quen với việc xử lý nhiều trong cơ sở dữ liệu. Ứng dụng hiện tại của chúng tôi có các thủ tục được lưu trữ phức tạp thực hiện xử lý khối lượng lớn dữ liệu và sau đó trả về một tập hợp kết quả nhỏ. Trong một kiến ​​trúc microservices, tôi nghĩ rằng các thực thể này nên được chia thành các bối cảnh giới hạn khác nhau. Chúng tôi biết cách tiếp cận hiện tại là xấu nhưng thật khó để biện minh cho việc đưa tất cả dữ liệu trở lại cấp ứng dụng để xử lý. Có thể các chế độ xem tổng hợp không chuẩn hóa hơn hoặc tính toán trước sẽ hữu ích.
Martin Bayly

1
Vâng, tôi hiểu. Phương pháp tiếp cận microservices không dành cho tất cả mọi người và bạn nên áp dụng nó một cách cẩn thận. Có lẽ bạn có thể bắt đầu với những thay đổi nhỏ hơn.
sap1ens

Có lẽ các nhà lập trình StackExchange sẽ là nơi tốt hơn để hỏi câu hỏi này: programmers.stackexchange.com/questions/279409/… và các câu hỏi khác được gắn thẻ microservices programmers.stackexchange.com/questions/tagged/microservices
Martin Bayly

9

Các dịch vụ có thể có các bản sao chỉ đọc của một số dữ liệu tham chiếu nhất định từ các dịch vụ khác.

Do đó, khi cố gắng cấu trúc lại cơ sở dữ liệu nguyên khối thành microservices (trái ngược với việc viết lại), tôi sẽ

  • tạo một lược đồ db cho dịch vụ
  • tạo các chế độ xem * được phiên bản ** trong lược đồ đó để hiển thị dữ liệu từ lược đồ đó cho các dịch vụ khác
  • tham gia chống lại những quan điểm chỉ đọc này

Điều này sẽ cho phép bạn sửa đổi dữ liệu bảng / strucutre một cách độc lập mà không làm hỏng các ứng dụng khác.

Thay vì sử dụng các chế độ xem, tôi cũng có thể cân nhắc sử dụng trình kích hoạt để sao chép dữ liệu từ một giản đồ này sang một giản đồ khác.

Đây sẽ là tiến trình gia tăng theo đúng hướng, thiết lập các đường nối của các thành phần của bạn và việc chuyển sang REST có thể được thực hiện sau đó.

* quan điểm có thể được mở rộng. Nếu yêu cầu thay đổi đột phá, hãy tạo phiên bản v2 của cùng một chế độ xem và xóa phiên bản cũ khi không còn cần thiết. ** hoặc Table-Valued-Functions, or Sprocs.


5

CQRS --- Mô hình Tổng hợp Truy vấn Lệnh là câu trả lời cho câu hỏi này theo Chris Richardson. Hãy để mỗi microservice cập nhật Mô hình dữ liệu của chính nó và tạo các sự kiện sẽ cập nhật chế độ xem cụ thể hóa có dữ liệu kết hợp được yêu cầu từ các microservices trước đó. MV này có thể là bất kỳ NoSql DB hoặc Redis hoặcasticsearch nào được tối ưu hóa truy vấn. Kỹ thuật này dẫn đến tính nhất quán Cuối cùng chắc chắn không tồi và tránh được việc phía ứng dụng tham gia theo thời gian thực. Hy vọng câu trả lời này.


2

Tôi sẽ tách biệt các giải pháp cho lĩnh vực sử dụng, giả sử là hoạt động và báo cáo.

Đối với các dịch vụ vi mô hoạt động để cung cấp dữ liệu cho các biểu mẫu đơn lẻ cần dữ liệu từ các dịch vụ vi mô khác (đây là trường hợp hoạt động), tôi nghĩ rằng việc sử dụng các phép nối API là cách nên làm. Bạn sẽ không sử dụng số lượng lớn dữ liệu, bạn có thể thực hiện tích hợp dữ liệu trong dịch vụ.

Trường hợp khác là khi bạn cần thực hiện các truy vấn lớn trên một lượng lớn dữ liệu để thực hiện tổng hợp, v.v. (trường hợp báo cáo). Đối với nhu cầu này, tôi sẽ nghĩ đến việc duy trì cơ sở dữ liệu dùng chung - tương tự như sơ đồ ban đầu của bạn và cập nhật nó với các sự kiện từ cơ sở dữ liệu microservice của bạn. Trên cơ sở dữ liệu được chia sẻ này, bạn có thể tiếp tục sử dụng các thủ tục đã lưu trữ của mình để tiết kiệm công sức của bạn và hỗ trợ tối ưu hóa cơ sở dữ liệu.


1

Trong Microservices, bạn tạo khác biệt. đọc các mô hình, ví dụ: nếu bạn có hai khác biệt. ngữ cảnh bị ràng buộc và ai đó muốn tìm kiếm trên cả dữ liệu thì ai đó cần lắng nghe các sự kiện từ cả ngữ cảnh bị giới hạn và tạo chế độ xem cụ thể cho ứng dụng.

Trong trường hợp này, sẽ có nhiều không gian hơn cần thiết, nhưng sẽ không cần nối và không cần nối.

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.