Dịch vụ vi mô không trùng lặp dữ liệu


19

Tôi thấy khó tránh khỏi trùng lặp dữ liệu hoặc cơ sở dữ liệu dùng chung cho ngay cả thiết kế microservice đơn giản nhất, điều này khiến tôi nghĩ rằng tôi đang thiếu một cái gì đó. Đây là một ví dụ cơ bản về vấn đề tôi gặp phải. Giả sử ai đó đang sử dụng một ứng dụng web để quản lý kho, họ sẽ cần hai dịch vụ; một cho hàng tồn kho quản lý các mặt hàng và số lượng trong kho và dịch vụ người dùng sẽ quản lý dữ liệu người dùng. Nếu chúng tôi muốn kiểm toán ai đã lưu trữ cơ sở dữ liệu, chúng tôi có thể thêm ID người dùng vào cơ sở dữ liệu cho dịch vụ kiểm kê dưới dạng lưu trữ cuối cùng theo giá trị.

Sử dụng ứng dụng, chúng tôi có thể muốn xem tất cả các mặt hàng sắp hết và một danh sách những người đã dự trữ chúng lần trước để chúng tôi có thể yêu cầu họ bổ sung lại. Sử dụng kiến ​​trúc được mô tả ở trên, một yêu cầu sẽ được gửi đến dịch vụ kiểm kê để lấy chi tiết vật phẩm của tất cả các mặt hàng có số lượng ít hơn 5. Điều này sẽ trả về một danh sách bao gồm ID người dùng. Sau đó, một yêu cầu riêng sẽ được gửi đến dịch vụ người dùng để lấy tên người dùng và chi tiết liên hệ cho danh sách ID người dùng thu được từ dịch vụ kiểm kê.

Điều này có vẻ hết sức kém hiệu quả và không cần nhiều dịch vụ nữa trước khi chúng tôi thực hiện nhiều yêu cầu đối với các API dịch vụ khác nhau, lần lượt thực hiện nhiều truy vấn cơ sở dữ liệu. Một cách khác là sao chép chi tiết người dùng trong dữ liệu hàng tồn kho. Khi người dùng thay đổi chi tiết liên hệ của họ, chúng tôi sẽ cần sao chép thay đổi thông qua tất cả các dịch vụ khác. Nhưng điều này dường như không phù hợp với ý tưởng bối cảnh bị ràng buộc của microservice. Chúng tôi cũng có thể sử dụng một cơ sở dữ liệu duy nhất và chia sẻ điều này giữa các dịch vụ khác nhau và có tất cả các vấn đề của cơ sở dữ liệu tích hợp .

Cách chính xác / tốt nhất để thực hiện điều này là gì?


5
Chào mừng bạn đến nghịch lý của các dịch vụ vi mô. Điều đó sẽ xuất hiện để làm cho mọi thứ đơn giản hơn thực sự có thể làm cho mọi thứ phức tạp hơn.
Robert Harvey

Cách "chính xác" giống như mọi khi: tìm ra cách làm việc phù hợp nhất với mục tiêu cụ thể của bạn.
Robert Harvey

1
@RobertHarvey Điều đó luôn luôn như vậy nhưng tôi đang cố gắng hiểu cách dịch vụ micros micros trong sách giáo khoa. Khi tôi hiểu nó nên hoạt động như thế nào trong một thế giới lý tưởng, tôi sẽ vui vẻ thay đổi nó để phù hợp với trường hợp sử dụng của mình.
Geraint Anderson

1
Nhưng việc bạn đóng khung câu hỏi của bạn về hiệu quả, đó là một yêu cầu phần mềm không có chức năng. Cách bạn giải quyết vấn đề hiệu quả là bằng cách hỏi trực tiếp cơ sở dữ liệu.
Robert Harvey

1
Tôi đã định viết một câu hỏi chính xác như của bạn. Tôi vẫn không thấy lợi thế trong MSA cho các ứng dụng web khá đơn giản. Tôi nghĩ rằng trong nhiều trường hợp, tính mô đun có thể đạt được mà không làm mọi thứ trở nên phức tạp.
Graffitnhost

Câu trả lời:


9

Tôi hoàn toàn bỏ lỡ nơi bạn được yêu cầu sao chép.

Một nguyên tắc trung tâm của các dịch vụ vi mô là để dịch vụ trở thành cơ quan duy nhất. Điều đó có nghĩa là hàng tồn kho và quản lý người dùng có thể hoàn toàn tách biệt. Tôi sẽ thiết kế quản lý người dùng để nó thậm chí không biết hệ thống hàng tồn kho.

Nhưng tôi sẽ thiết kế hệ thống kiểm kê để nó không bao giờ lưu trữ bất cứ thứ gì về người dùng ngoài ID người dùng. Điều đó quan tâm đến vấn đề tuyên truyền thay đổi thông tin người dùng của bạn.

Đối với những thứ cần cả thông tin hàng tồn kho và thông tin người dùng như nhật ký, kiểm toán và bản in, chúng không được cập nhật khi thay đổi thông tin. Họ là một kỷ lục của những gì đã được. Một lần nữa, bạn không tuyên truyền thay đổi.

Vì vậy, trong mọi trường hợp, khi bạn muốn thông tin người dùng mới nhất, bạn hãy hỏi dịch vụ thông tin người dùng.


@Geraint: Bạn có thể nói cụ thể hơn về loại trùng lặp nào đang xảy ra trong hệ thống của bạn không?
Robert Harvey

1
Cảm ơn. Sự trùng lặp được gọi là sao chép chi tiết liên hệ của người dùng vào dịch vụ kiểm kê nhưng bạn đã giải quyết điều đó (nghĩa là không bắt buộc). Việc di chuyển từ một cơ sở dữ liệu quan hệ đơn lẻ mà tôi có thể lấy dữ liệu tồn kho và dữ liệu người dùng cùng tham gia để thực hiện hai lệnh gọi API riêng biệt trong đó lần thứ hai không thể bắt đầu cho đến khi kết quả đầu tiên trả về kết quả. Nhưng tôi đoán đó là một phần của việc đánh giá liệu tôi có sử dụng microservice hay thứ gì khác không.
Geraint Anderson

Đó là cùng một mẹo mà DB sẽ sử dụng nếu nó quản lý cả hai. Bạn không sao chép thông tin người dùng vào bảng kiểm kê. Bạn cho nó một chìa khóa nước ngoài. ID người dùng đang thực hiện cùng một công việc trên các dịch vụ. Chỉ cần làm cho nó độc đáo.
candied_orange

It seems counter-intuitive to move from a single relational database where I could get the inventory data and the user data with a joinHãy nhớ rằng "lý tưởng" có một cửa hàng cho mỗi dịch vụ (hoặc hơn!). Vì vậy, không có gì như "tham gia" giữa "ranh giới". Lý do rất đơn giản, DB tạo ra khớp nối giữa các dịch vụ. Không giống như đề xuất @CandiedOrange, tôi nghĩ rằng chúng tôi có thể sao chép tối thiểu dữ liệu từ dịch vụ này sang dịch vụ khác. Tôi đang đề cập đến dữ liệu không có khả năng thay đổi. Nếu dups này cải thiện hiệu quả và hiệu suất (và cả hai đều được yêu cầu), "ưu điểm" có thể sẽ đặt ra "nhược điểm"
Laiv

@GeraintAnderson Ý tôi là, nếu bạn cần hiệu quả (theo định nghĩa là một yêu cầu phi chức năng), có nhiều cách để làm điều đó. Tức là các trang yêu cầu dữ liệu từ Dịch vụ kiểm kê (như 10 yếu tố), lấy từng trang và sử dụng trang đó để yêu cầu dữ liệu từ Dịch vụ người dùng và tổng hợp ở cuối. Bằng cách đó bạn giữ được ranh giới của mình trong khi tận dụng sự song song của các dịch vụ độc lập. Ngay cả sau đó, đừng bận tâm cho đến khi bạn xác định đó là một nút cổ chai thực sự của ứng dụng phải được giải quyết - chờ thêm 1/2 giây cho công việc qua đêm 1 giây không thành vấn đề với bất kỳ ai.
Delioth

10

Tôi thấy khó tránh khỏi trùng lặp dữ liệu ....

Theo ebook của Microsoft về kiến ​​trúc microservice , không có gì sai khi sao chép dữ liệu. Về cơ bản, sao chép dữ liệu làm tăng sự tách rời giữa các dịch vụ và do đó củng cố vai trò của chúng như một cơ quan duy nhất. Một đoạn có liên quan:

Và cuối cùng (và đây là nơi phát sinh hầu hết các vấn đề khi xây dựng microservice), nếu microservice ban đầu của bạn cần dữ liệu ban đầu được sở hữu bởi các dịch vụ siêu nhỏ khác, đừng dựa vào việc đưa ra yêu cầu đồng bộ cho dữ liệu đó. Thay vào đó, sao chép hoặc truyền dữ liệu đó (chỉ các thuộc tính bạn cần) vào cơ sở dữ liệu của dịch vụ ban đầu bằng cách sử dụng tính nhất quán cuối cùng (thường bằng cách sử dụng các sự kiện tích hợp ...


1
Tôi hoàn toàn không đồng ý. Nó làm cho nó khó khăn hơn để duy trì. Nó làm cho bạn thực hiện các giao dịch giữa các dịch vụ siêu nhỏ khi một cái gì đó phải được thêm, cập nhật hoặc loại bỏ. Trong trường hợp bạn muốn ngăn chặn một điểm thất bại duy nhất, bạn có thể sử dụng yêu cầu hoặc bất kỳ loại bộ nhớ đệm nào khác.
Alan Sereb

@AlanSereb Khó bảo trì hơn, nhưng vấn đề là đôi khi bạn không có lựa chọn nào khác. Ví dụ, nếu bạn cần tạo FK giữa các đối tượng sống trong hai cơ sở dữ liệu thì sao? Cách duy nhất để đảm bảo tính nhất quán khi thực hiện các truy vấn trong DB cục bộ, là sao chép dữ liệu. Hãy xem: stackoverflow.com/a/4452586/2255491
David D.

Tôi đồng ý. Một cách tiếp cận tuyệt vời khác là đi theo con đường tìm nguồn cung ứng sự kiện. Và có tất cả các đột biến được thực hiện thông qua đường ống sự kiện
Alan Sereb

3

một yêu cầu sẽ được gửi đến dịch vụ kiểm kê để lấy chi tiết vật phẩm của tất cả các mặt hàng có số lượng ít hơn 5. Điều này sẽ trả về một danh sách bao gồm ID người dùng. Sau đó, một yêu cầu riêng sẽ được gửi đến dịch vụ người dùng để lấy tên người dùng và chi tiết liên hệ cho danh sách ID người dùng thu được từ dịch vụ kiểm kê.

Thật vậy, vâng.

Được cấp, trong một khối nguyên khối, bạn có thể có một mô hình Hàng tồn kho mà bạn truy vấn cho các mục có liên quan, đưa dữ liệu đó vào Mô hình người dùng và nhận cùng một dữ liệu.

Hoặc bạn có thể đưa nó đi xa hơn, nếu bạn có chúng trong cùng một cơ sở dữ liệu quan hệ và viết SQL và cơ sở dữ liệu sẽ lấy bảng kiểm kê và bảng người dùng, nó thực hiện một số phép thuật và bạn sẽ có được dữ liệu bạn đang theo dõi.

Bất kể bạn làm điều đó như thế nào, ở đâu đó sẽ có mã về cơ bản tìm nạp danh sách id người dùng từ hệ thống kiểm kê, đưa chúng vào hệ thống người dùng và biên dịch danh sách dữ liệu.

Câu hỏi bạn cần trả lời là về hiệu suất và bảo trì và các phẩm chất "mềm" khác.

Lợi ích chính của microservice là nhân rộng. Nếu bạn có mười nghìn người dùng trên một máy và hơi chậm chạp, bạn có thể thêm một máy khác và hệ thống trở nên nhanh gấp đôi. Thêm tám lần nữa và nó nhanh gấp mười lần. (Tỷ lệ tuyến tính có thể lạc quan, nhưng đó là lý tưởng và không phải không hợp lý để hy vọng.)

Và đây là mỗi dịch vụ . Nếu hệ thống kiểm kê là nút cổ chai, nó được sử dụng cho nhiều hơn các báo cáo về người dùng, bạn có thể thêm nhiều máy hơn vào dịch vụ đó . Các máy cũng có thể được chuyên dụng; dịch vụ này cần rất nhiều bộ nhớ, dịch vụ đó thực hiện các phép tính nặng và cần nhiều cpu hơn.

Nếu bạn không cần mở rộng quy mô, có một lợi ích khác của microservice: chúng là mô-đun . Tất nhiên, các ứng dụng nguyên khối cũng có thể là mô-đun và bạn có cơ sở dữ liệu được chuẩn hóa và ... nhưng trên thực tế, các bức tường giữa các mô-đun giống như các bức tường kính trong trường hợp tốt nhất và trong các trường hợp xấu nhất. Microservice được phân tách bằng thép rắn.

Nếu hệ thống người dùng của bạn thực sự bắt lửa, điều đó sẽ không ảnh hưởng đến hệ thống hàng tồn kho của bạn một chút. Bạn sẽ không thể in các báo cáo đẹp về người đã dự trữ những gì, nhưng khách hàng sẽ có thể đặt hàng an toàn với kiến ​​thức rằng các mặt hàng được lưu trữ ở đó.

Và bạn không sao chép dữ liệu trong microservice , bất kỳ nhiều hơn bạn làm trong cơ sở dữ liệu quan hệ (*). Trong cơ sở dữ liệu quan hệ, bạn có thể thực hiện tham gia và tương đương là hợp nhất các danh sách theo mã như được mô tả.

Bạn cũng có thể thêm một chế độ xem , tương đương là thêm một dịch vụ mới hợp nhất cho bạn; điều đó sẽ dẫn đến ba yêu cầu; một đến dịch vụ mới và sau đó dịch vụ đó thực hiện hai dịch vụ ban đầu. Cơ sở dữ liệu quan hệ có những thứ ưa thích giúp tối ưu hóa các khung nhìn, phải được thực hiện ở cấp độ dịch vụ. Bạn không nhận được nó "miễn phí".

Bộ nhớ đệm khác với sao chép dữ liệu ở chỗ nếu hai giá trị không khớp bạn biết cái nào sai. Nó thường được sử dụng trong các dịch vụ siêu nhỏ để mang lại sự sẵn có với chi phí nhất quán (định lý CAP). Vì cơ sở dữ liệu quan hệ hoàn toàn có sẵn hàng thịt trên bàn thờ về tính nhất quán, nó ít phổ biến hơn trong chúng. Tôi muốn nói rằng không có gì vốn có về microservice giúp việc lưu trữ bộ đệm dễ dàng hơn, nhưng trong thực tế, bộ nhớ đệm là mối quan tâm chính và điều đó làm cho bộ nhớ đệm dễ dàng hơn trong microservice .

(*) Nếu việc sao chép dữ liệu trong một nhóm dịch vụ siêu nhỏ thì có lẽ sẽ có ý nghĩa trong cơ sở dữ liệu quan hệ tương đương.


3
Tôi thực sự thích câu trả lời của bạn cho đến khi phần "không trùng lặp dữ liệu trong microservice". Tôi nghĩ rằng có những trường hợp sao chép dữ liệu là cách tiếp cận đúng. Nó cải thiện khả năng chịu lỗi và tự chủ. Nếu dịch vụ người dùng không hoạt động, dịch vụ kiểm kê vẫn có thể hiển thị danh sách hàng tồn kho thấp với người đã dự trữ chúng lần cuối.
Peter Pompeii

1
@peterpompeii Tôi gọi đó là bộ nhớ đệm, không phải sao chép dữ liệu. Sao chép dữ liệu là khi bạn có hai nơi để cập nhật cho một mốc thời gian, lưu vào bộ đệm khi có một nơi và tự động lan truyền đến các nơi khác. Ngoài ra tôi nói nhiều hơn quan hệ. Nếu nó có ý nghĩa trong một cơ sở dữ liệu quan hệ để sao chép dữ liệu thì nó có ý nghĩa trong một dịch vụ siêu nhỏ. Tôi nghĩ rằng chúng tôi đồng ý và phần đó có thể rõ ràng hơn, nhưng tôi chỉ có một điện thoại ngay bây giờ vì vậy sẽ không cập nhật văn bản ngay bây giờ.
Odalrick

@PeterPompeii Hy vọng phần được thêm về bộ nhớ đệm giải quyết một số mối quan tâm của bạn.
Odalrick

1
@Odalrick những gì bạn mô tả âm thanh như sao chép dữ liệu. Sao chép và lưu trữ là cả hai hình thức sao chép dữ liệu. Sao chép là khi một bản sao được đảm bảo luôn có tất cả các dữ liệu cần thiết. Bộ nhớ đệm là theo yêu cầu. Bộ nhớ đệm có thể có một bỏ lỡ. Bộ nhớ đệm cho tính khả dụng không có ý nghĩa nhiều như bộ nhớ đệm cho hiệu suất. TL; DR nếu bạn đang lưu trữ một bản sao hoàn chỉnh của một cái gì đó với đủ tính nhất quán đảm bảo rằng bạn không bao giờ cần phải kiểm tra các lỗi, thì đó không phải là bộ đệm.
Brandon

1
@Brandon Một sự khác biệt khác giữa sao chép và lưu trữ là cách bạn biết dữ liệu nào sai khi có sự khác biệt. Bản sao xác định một số quy tắc về cách hợp nhất dữ liệu. Mặt khác , bộ nhớ đệm luôn luôn : bộ đệm bị sai.
Odalrick
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.