2017-07-02 19 views
13

Kiến trúc Microservices cho thấy mỗi dịch vụ phải xử lý dữ liệu riêng của nó. Do đó bất kỳ dịch vụ nào (Service A) phụ thuộc vào dữ liệu thuộc sở hữu của dịch vụ khác (dịch vụ B) nên truy cập dữ liệu đó không phải bằng cách thực hiện các cuộc gọi DB trực tiếp mà thông qua api được cung cấp bởi dịch vụ thứ hai (dịch vụ B).Microservices: cách xử lý các mối quan hệ khóa ngoài

Vì vậy, các phương pháp hay nhất của microservices đề xuất về kiểm tra các ràng buộc khóa ngoại.

Ví dụ: Tôi đang phát triển tính năng phân phối (microservice 1) cho sản phẩm và một số sản phẩm nhất định chỉ có thể phân phối tới các vị trí nhất định như được đề cập trong bảng sản phẩm.

Làm cách nào để đảm bảo rằng dịch vụ microservice 1 (tính năng phân phối) không đưa lệnh đến một vị trí không được bảo vệ. Tôi có câu hỏi này vì tính năng phân phối không thể truy cập trực tiếp vào cơ sở dữ liệu sản phẩm, do đó không có ràng buộc áp dụng ở cấp DB khi lệnh giao hàng được đặt vào cơ sở dữ liệu phân phối (không thể kiểm tra xem có khớp khóa ngoại trong cơ sở dữ liệu sản phẩm hay không hoặc bảng).

Trả lời

8

Có thể sử dụng cơ sở dữ liệu được chia sẻ cho nhiều dịch vụ nhỏ. Bạn có thể tìm thấy các mẫu để quản lý dữ liệu của microservices trong liên kết này: http://microservices.io/patterns/data/database-per-service.html. Nhân đây, nó là một blog rất hữu ích cho kiến ​​trúc microservices.

Trong trường hợp của bạn, bạn muốn sử dụng cơ sở dữ liệu cho mỗi mẫu dịch vụ. Điều này làm cho microservices tự chủ hơn. Trong tình huống này, bạn nên sao chép một số dữ liệu của bạn trong nhiều microservices. Bạn có thể chia sẻ dữ liệu với các cuộc gọi api giữa các dịch vụ nhỏ hoặc bạn có thể chia sẻ dữ liệu đó với tính năng nhắn tin không đồng bộ. Nó phụ thuộc vào cơ sở hạ tầng và tần suất thay đổi dữ liệu của bạn. Nếu nó không thay đổi thường xuyên, bạn nên sao chép dữ liệu với các sự kiện không đồng bộ.

Trong ví dụ của bạn, dịch vụ Phân phối có thể trùng lặp vị trí phân phối và thông tin sản phẩm. Dịch vụ sản phẩm quản lý sản phẩm và địa điểm. Sau đó, dữ liệu cần thiết được sao chép vào cơ sở dữ liệu của dịch vụ Chuyển phát với các thông điệp không đồng bộ (ví dụ bạn có thể sử dụng thỏ mq hoặc apache kafka). Dịch vụ phân phối không thay đổi dữ liệu sản phẩm và vị trí nhưng nó sử dụng dữ liệu khi nó đang thực hiện công việc của mình. Nếu phần dữ liệu sản phẩm được sử dụng bởi dịch vụ Chuyển phát thường thay đổi, việc sao chép dữ liệu bằng nhắn tin không đồng bộ sẽ rất tốn kém. Trong trường hợp này, bạn nên thực hiện cuộc gọi api giữa dịch vụ Sản phẩm và Giao hàng. Dịch vụ giao hàng yêu cầu Dịch vụ sản phẩm kiểm tra xem một sản phẩm có thể giao hàng đến một địa điểm cụ thể hay không. Dịch vụ giao hàng yêu cầu Sản phẩm dịch vụ có mã định danh (tên, id, v.v.) của một sản phẩm và địa điểm. Các số nhận dạng này có thể được lấy từ người dùng cuối hoặc được chia sẻ giữa các dịch vụ nhỏ. Bởi vì các cơ sở dữ liệu của microservices là khác nhau ở đây, chúng tôi không thể xác định các khóa nước ngoài giữa các dữ liệu của các microservices.

Cuộc gọi Api có thể dễ thực hiện hơn nhưng chi phí mạng cao hơn trong tùy chọn này. Ngoài ra các dịch vụ của bạn ít tự chủ hơn khi bạn đang thực hiện các cuộc gọi api. Bởi vì, trong ví dụ của bạn khi dịch vụ Sản phẩm ngừng hoạt động, Dịch vụ phân phối không thể thực hiện công việc của mình. Nếu bạn sao chép dữ liệu bằng tính năng nhắn tin không đồng bộ, dữ liệu cần thiết để thực hiện phân phối nằm trong cơ sở dữ liệu của dịch vụ microservice phân phối. Khi dịch vụ Sản phẩm không hoạt động, bạn sẽ có thể giao hàng.

+0

Great câu trả lời. Tôi sử dụng các cuộc gọi API, nhưng nó cũng cần sắp xếp và phân trang dữ liệu từ một dịch vụ khác. Bạn có biết cách tiếp cận tốt nhất cho trường hợp đó không? – tranceholic

+0

Bạn nên thêm các tham số liên quan đến phân trang và sắp xếp vào api của bạn. Sau đó, trách nhiệm của việc nhận được đúng trang với đúng thứ tự sẽ được thực hiện bởi người tiêu dùng của api. Có một số công nghệ được sử dụng để định nghĩa một api như GraphQL. Theo tôi biết, những công nghệ đó đã có các tính năng sắp xếp và phân trang. Nếu bạn không sử dụng loại công nghệ này, bạn có thể chỉ cần lấy các tham số từ ứng dụng khách của bạn và sử dụng chúng để trả về dữ liệu của bạn được sắp xếp với các trang. –

4

Khi phân phối mã của bạn để đạt được khớp nối giảm, bạn muốn tránh chia sẻ tài nguyên và dữ liệu là tài nguyên bạn muốn tránh chia sẻ. Một điểm khác là chỉ có một thành phần trong hệ thống của bạn sở hữu dữ liệu (cho các hoạt động thay đổi trạng thái), các thành phần khác có thể ĐỌC nhưng KHÔNG VIẾT, chúng có thể có bản sao dữ liệu hoặc bạn có thể chia sẻ lấy trạng thái mới nhất của một đối tượng.

Giới thiệu tính toàn vẹn tham chiếu sẽ giới thiệu lại khớp nối, thay vào đó bạn muốn sử dụng một cái gì đó như Guids cho khóa chính của bạn, chúng sẽ được tạo bởi người tạo đối tượng, phần còn lại là tất cả về quản lý tính nhất quán cuối cùng.

Hãy xem Udi Dahan của talk in NDC Oslo for a more details

Hope this helps

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