2016-06-20 18 views
7

Im về tìm hiểu cách hoạt động của kiến ​​trúc microservices. Cho đến nay tôi không hiểu rằng mỗi microservice cần cơ sở dữ liệu riêng của nó, có ý nghĩa.Làm thế nào để giữ cho DB đồng bộ khi sử dụng kiến ​​trúc microservices?

Vì vậy, giả sử chúng tôi có một microservice khách hàng chịu trách nhiệm tạo khách hàng và trả lại danh sách khách hàng. Các dịch vụ sẽ ofcource có nó DB khách hàng riêng.

Cho phép nói rằng chúng tôi có tải rất cao trên dịch vụ này, vì vậy chúng tôi đã chọn chia tỷ lệ 20x.

Så chúng tôi có 20 microservices và mỗi có DB riêng của mình, và tất cả các dịch vụ nằm phía sau một cân bằng tải.

Bây giờ khách hàng muốn tạo khách hàng, trình cân bằng tải sẽ gửi yêu cầu của khách hàng đến dịch vụ 9/20 và khách hàng được tạo.

Trong lần yêu cầu tiếp theo, cùng một khách hàng muốn chắc chắn rằng khách hàng được tạo và muốn xem danh sách khách hàng, theo yêu cầu, LB gửi anh đến dịch vụ 11/20.

Bây giờ, làm cách nào để đảm bảo rằng dịch vụ 9/20 đã đồng bộ hóa khách hàng mới tạo với db của dịch vụ 11/20?

Trong MSSQL có chức năng giữ cho DB đồng bộ trước khi thực hiện cam kết ban đầu, để lưu dữ liệu trong tất cả các cơ sở dữ liệu khác trước, nhưng cách tiếp cận này sẽ gây ra sự cố trong thời gian dài, vì có nhiều dịch vụ hơn thời gian lâu hơn để thực hiện cam kết?

Trả lời

6

mỗi microservice cần cơ sở dữ liệu riêng của mình

Một DB riêng biệt cho mỗi microservice không phải là một điều kiện tiên quyết (và cũng không một yêu cầu, thực sự).

Bạn có thể có nhiều dịch vụ nhỏ như bạn muốn làm việc trên cùng cơ sở dữ liệu, nhưng sử dụng các lược đồ khác nhau chẳng hạn.

Ngữ cảnh bị chặn của microservice phải là ranh giới.

Giả sử chúng tôi có tải rất cao về dịch vụ này, vì vậy chúng tôi chọn chia tỷ lệ 20x.

Chia tỷ lệ thành (X) trường hợp của cùng một dịch vụ không có nghĩa là phải có cơ sở dữ liệu riêng cho mỗi trường hợp của cùng một dịch vụ đó.

Hầu hết các cơ sở dữ liệu được thiết kế với các kết nối đồng thời, người dùng, giao dịch trong đầu. một cá thể cơ sở dữ liệu duy nhất (với một số tương tranh lạc quan) có thể xử lý hàng trăm (nếu không phải hàng nghìn) kết nối đồng thời một cách duyên dáng.

Nếu bạn rõ ràng đã chọn có một DB riêng cho mỗi phiên bản của cùng một dịch vụ, thì bạn sẽ phải đồng bộ hóa các cơ sở dữ liệu đó. và, rất có thể, tính nhất quán của dữ liệu sẽ bị ảnh hưởng.

Dưới đây là một số gợi ý:

  • sử dụng một cơ sở dữ liệu duy nhất cho mỗi microservice (không tính theo đầu chẳng hạn) dù có bao nhiêu trường hợp đang sử dụng nó. Và chỉ xem xét một DB mỗi trường hợp khi bạn chắc chắn một DB duy nhất không thể xử lý tải.

  • Sử dụng một lớp chia sẻ bộ nhớ cache trên đầu trang của DB (có thể redis bộ nhớ cache)

  • Sử dụng cụm cơ sở dữ liệu để đối phó với tải cao/sẵn có của cơ sở dữ liệu.

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