Hạt giống cơ sở dữ liệu microservice


10

Cung cấp dịch vụ A (CMS) điều khiển một mô hình (Sản phẩm, giả sử các trường duy nhất mà nó có là id, tiêu đề, giá cả) và các dịch vụ B (Vận chuyển) và C (Email) phải hiển thị cho mô hình cụ thể cách tiếp cận nên để đồng bộ hóa thông tin mô hình nhất định trên các dịch vụ đó trong phương pháp tìm nguồn cung ứng sự kiện? Giả sử rằng danh mục sản phẩm hiếm khi thay đổi (nhưng thay đổi) và có những quản trị viên có thể truy cập dữ liệu của các lô hàng và email rất thường xuyên (các chức năng ví dụ là: B: display titles of products the order containedvà C display content of email about shipping that is going to be sent:). Mỗi dịch vụ có DB riêng.

Giải pháp 1

Gửi tất cả thông tin bắt buộc về Sản phẩm trong sự kiện - điều này có nghĩa là cấu trúc sau cho order_placed:

{
    order_id: [guid],
    product: {
        id: [guid],
        title: 'Foo',
        price: 1000
    }
}

Trên dịch vụ B và C thông tin sản phẩm được lưu trữ trong productthuộc tính JSON trên ordersbảng

Như vậy, để hiển thị thông tin cần thiết, chỉ có dữ liệu được truy xuất từ ​​sự kiện được sử dụng

Vấn đề : tùy thuộc vào những thông tin khác cần được trình bày trong B và C, lượng dữ liệu trong sự kiện có thể tăng lên. B và C có thể không yêu cầu cùng một thông tin về Sản phẩm, nhưng sự kiện sẽ phải chứa cả hai (trừ khi chúng tôi tách các sự kiện thành hai). Nếu dữ liệu đã cho không xuất hiện trong sự kiện đã cho, mã không thể sử dụng dữ liệu đó - nếu chúng tôi thêm tùy chọn màu cho Sản phẩm đã cho, đối với các đơn hàng hiện tại ở B và C, sản phẩm đã cho sẽ không màu trừ khi chúng tôi cập nhật sự kiện và sau đó chạy lại chúng .

Giải pháp 2

Chỉ gửi hướng dẫn sản phẩm trong sự kiện - điều này có nghĩa là cấu trúc sau cho order_placed:

{
    order_id: [guid],
    product_id: [guid]
}

Trên các dịch vụ B và C thông tin sản phẩm được lưu trữ trong product_idthuộc tính trên ordersbảng

Thông tin sản phẩm được truy xuất bởi các dịch vụ B và C khi được yêu cầu bằng cách thực hiện lệnh gọi API đến A/product/[guid]điểm cuối

Vấn đề : điều này làm cho B và C phụ thuộc vào A (mọi lúc). Nếu lược đồ của Sản phẩm thay đổi trên A, các thay đổi phải được thực hiện trên tất cả các dịch vụ phụ thuộc vào chúng (đột nhiên)

Giải pháp 3

Chỉ gửi hướng dẫn sản phẩm trong sự kiện - điều này có nghĩa là cấu trúc sau cho order_places:

{
    order_id: [guid],
    product_id: [guid]
}

Trên các dịch vụ B và C thông tin sản phẩm được lưu trữ trong productsbảng; vẫn còn product_idtrên ordersbàn, nhưng có sự sao chép productsdữ liệu giữa A, B và C; B và C có thể chứa thông tin khác nhau về Sản phẩm so với A

Thông tin sản phẩm được tạo mầm khi dịch vụ B và C được tạo và được cập nhật bất cứ khi nào thông tin về Sản phẩm thay đổi bằng cách gọi đến A/productđiểm cuối (hiển thị thông tin bắt buộc của tất cả các sản phẩm) hoặc bằng cách thực hiện truy cập DB trực tiếp vào A và sao chép thông tin sản phẩm cần thiết được cung cấp dịch vụ.

Vấn đề : điều này làm cho B và C phụ thuộc vào A (khi gieo hạt). Nếu lược đồ của Sản phẩm thay đổi trên A, các thay đổi phải được thực hiện trên tất cả các dịch vụ phụ thuộc vào chúng (khi gieo hạt)


Theo hiểu biết của tôi, cách tiếp cận đúng sẽ là đi theo giải pháp 1 và cập nhật lịch sử sự kiện theo logic nhất định (nếu Danh mục sản phẩm không thay đổi và chúng tôi muốn thêm màu để hiển thị, chúng tôi có thể cập nhật lịch sử một cách an toàn để có trạng thái hiện tại Sản phẩm và điền dữ liệu bị thiếu trong các sự kiện) hoặc phục vụ cho việc không tồn tại dữ liệu đã cho (nếu Danh mục sản phẩm đã thay đổi và chúng tôi muốn thêm màu để hiển thị, chúng tôi không thể chắc chắn liệu tại thời điểm đó trong Sản phẩm đã cho trước đó có màu hay không - chúng ta có thể giả sử rằng tất cả các Sản phẩm trong danh mục trước đó đều màu đen và phục vụ cho việc cập nhật các sự kiện hoặc mã)


Liên quan đến updating event history- Trong sự kiện tìm nguồn cung ứng sự kiện lịch sử là nguồn sự thật của bạn và không bao giờ nên được thay đổi mà chỉ đi về phía trước. Nếu các sự kiện thay đổi, bạn có thể sử dụng phiên bản sự kiện hoặc các giải pháp tương tự nhưng khi phát lại các sự kiện của bạn đến một thời điểm cụ thể thì trạng thái của dữ liệu sẽ như lúc đó.
Không có

Liên quan đến việc lưu trữ dữ liệu (lược đồ, v.v.) để truy vấn và các trường được thêm / xóa, v.v., chúng tôi đã sử dụng cosmosDB lưu trữ dữ liệu trong JSON như lúc đó. Điều duy nhất cần phiên bản sau đó là các sự kiện và / hoặc các lệnh. Bạn cũng cần cập nhật các hợp đồng điểm cuối và các đối tượng giá trị có chứa dữ liệu phản hồi các truy vấn từ máy khách (web, thiết bị di động, v.v ...). Dữ liệu cũ hơn không có trường sẽ có giá trị mặc định hoặc trống, phù hợp với doanh nghiệp nhưng lịch sử sự kiện vẫn giữ nguyên và chỉ tiến về phía trước.
Không có

@ Ý updating event historytôi là: đi qua tất cả các sự kiện, sao chép chúng từ một luồng (v1) sang một luồng khác (v2) để duy trì lược đồ sự kiện nhất quán.
eith

Bên cạnh đó, trong lĩnh vực thương mại / thương mại điện tử, bạn có thể muốn nắm bắt giá như đã nêu khi giá thay đổi thường xuyên. Một mức giá như được hiển thị cho người dùng có thể khác nhau tại thời điểm đặt hàng thực tế được nắm bắt. Có bất kỳ cách nào để giải quyết vấn đề, nhưng đó là một cách nên được xem xét.
CPerson

@CPerson yup - giá có thể là một trong những thuộc tính được thông qua trong chính sự kiện. Mặt khác, URL cho hình ảnh có thể tồn tại trong sự kiện (đại diện cho ý định display image at the point when purchase was made) hoặc không thể (đại diện cho ý định display current image as it within catalog)
ngày

Câu trả lời:


3

Giải pháp số 3 thực sự gần với ý tưởng đúng đắn.

Một cách để suy nghĩ về điều này: B và C là mỗi bộ nhớ đệm bản "địa phương" của dữ liệu mà họ cần. Tin nhắn được xử lý tại B (và tương tự tại C) sử dụng thông tin được lưu trong bộ nhớ cache cục bộ. Tương tự, các báo cáo được tạo ra bằng cách sử dụng thông tin lưu trữ cục bộ.

Dữ liệu được sao chép từ nguồn vào bộ đệm thông qua API ổn định. B và C thậm chí không cần sử dụng cùng một API - họ sử dụng bất kỳ giao thức tìm nạp nào phù hợp với nhu cầu của họ. Trong thực tế, chúng tôi xác định một hợp đồng - lược đồ giao thức và thông điệp - ràng buộc nhà cung cấp và người tiêu dùng. Sau đó, bất kỳ người tiêu dùng cho hợp đồng đó có thể được kết nối với bất kỳ nhà cung cấp. Những thay đổi không tương thích ngược đòi hỏi một hợp đồng mới.

Các dịch vụ chọn chiến lược vô hiệu hóa bộ đệm phù hợp cho nhu cầu của họ. Điều này có thể có nghĩa là kéo các thay đổi từ nguồn theo lịch trình thông thường hoặc phản hồi lại thông báo rằng mọi thứ có thể đã thay đổi hoặc thậm chí là "theo yêu cầu" - hoạt động như một bộ đọc qua bộ đệm, quay trở lại bản sao dữ liệu được lưu trữ khi nguồn không có sẵn.

Điều này mang lại cho bạn "quyền tự chủ", theo nghĩa B và C có thể tiếp tục cung cấp giá trị doanh nghiệp khi A tạm thời không khả dụng.

Đề nghị đọc: Dữ liệu bên ngoài, Dữ liệu bên trong , Pat Helland 2005.


Vâng, tôi hoàn toàn đồng ý với những gì bạn đã viết ở đây và giải pháp 3 là giải pháp goto tôi đã áp dụng, tuy nhiên, đó không phải là phương pháp tìm nguồn cung ứng sự kiện, vì, nếu chúng tôi phát lại các sự kiện, chúng tôi không nhất thiết muốn sử dụng trạng thái hiện tại của Sản phẩm; chúng tôi muốn sử dụng trạng thái như tại thời điểm diễn ra sự kiện. Tất nhiên, điều này có thể tốt (phụ thuộc vào yêu cầu kinh doanh). Tuy nhiên, nếu chúng tôi muốn theo dõi các thay đổi đối với danh mục, điều đó cũng đòi hỏi phải tìm nguồn cung ứng sự kiện và phụ thuộc vào số lượng dữ liệu đó, chúng tôi có thể quay lại giải pháp 1.
ví dụ

1
Tôi nghĩ rằng bạn đã có nó với giải pháp # 3. Nếu bạn cần phát lại tính nhất quán với danh mục, nguồn sự kiện cũng vậy. Bạn chỉ cần phát lại khi bạn khởi tạo lại hạt giống, có lẽ là lúc khởi động - một khi bạn đã lên, bạn chỉ cần xem các sự kiện mới, vì vậy lượng dữ liệu có thể không phải là vấn đề thực sự. Tuy nhiên, ngay cả khi đó bạn có tùy chọn (nếu cần) là sử dụng điểm kiểm tra, tức là "đây là trạng thái kể từ sự kiện 1.000", vì vậy bạn thực hiện điều đó và bây giờ bạn chỉ phải phát lại sự kiện 1.001 đến hiện tại thay vì toàn bộ lịch sử .
Mike B.

2

Có hai điều khó khăn trong Khoa học Máy tính và một trong số đó là vô hiệu hóa bộ đệm.

Giải pháp 2 hoàn toàn là vị trí mặc định của tôi và bạn thường chỉ nên xem xét triển khai bộ đệm ẩn nếu bạn gặp phải một trong các tình huống sau:

  1. Cuộc gọi API đến Dịch vụ A đang gây ra sự cố về hiệu suất.
  2. Chi phí dịch vụ A không hoạt động và không thể truy xuất dữ liệu có ý nghĩa đối với doanh nghiệp.

Vấn đề hiệu suất thực sự là trình điều khiển chính. Có nhiều cách giải quyết # 2 không liên quan đến bộ nhớ đệm, như đảm bảo Dịch vụ A khả dụng cao.

Bộ nhớ đệm tăng thêm độ phức tạp đáng kể cho một hệ thống và có thể tạo ra các trường hợp cạnh khó lý do và các lỗi rất khó lặp lại. Bạn cũng phải giảm thiểu rủi ro khi cung cấp dữ liệu cũ khi dữ liệu mới hơn tồn tại, điều này thể tệ hơn nhiều từ góc độ kinh doanh so với (ví dụ) hiển thị thông báo "Dịch vụ A không hoạt động - vui lòng thử lại sau".

Từ bài viết xuất sắc này của Udi Dahan:

Những sự phụ thuộc này leo lên bạn từ từ, buộc dây giày của bạn lại với nhau, dần dần làm chậm tốc độ phát triển, làm suy yếu sự ổn định của cơ sở mã của bạn khi thay đổi một phần của hệ thống phá vỡ các phần khác. Đó là một cái chết chậm chạp bởi hàng ngàn vết cắt, và kết quả là không ai biết chính xác quyết định lớn nào mà chúng tôi đưa ra khiến mọi thứ trở nên tồi tệ như vậy.

Ngoài ra, nếu bạn cần truy vấn dữ liệu sản phẩm theo thời gian, việc này cần được xử lý theo cách dữ liệu được lưu trữ trong cơ sở dữ liệu Sản phẩm (ví dụ: ngày bắt đầu / ngày kết thúc), cần được hiển thị rõ ràng trong API (ngày hiệu lực cần phải là đầu vào cho lệnh gọi API để truy vấn dữ liệu).


1
@SavvasKleanthous "Mạng đáng tin cậy" là một trong những sai lầm của điện toán phân tán. Nhưng phản hồi cho sai lầm đó không nên là "lưu trữ mọi bit dữ liệu từ mọi dịch vụ trong mọi dịch vụ khác" (tôi nhận ra rằng đó là một chút cường điệu). Hy vọng rằng một dịch vụ có thể không có sẵn và xử lý đó là một điều kiện lỗi. Nếu bạn gặp một tình huống hiếm gặp khi Dịch vụ A đi xuống có ảnh hưởng lớn đến doanh nghiệp, thì (hãy cẩn thận!) Hãy xem xét các lựa chọn khác.
Phil Sandler

1
@SavvasKleanthous cũng xem xét (như tôi đã đề cập trong câu trả lời của tôi) mà trở về dữ liệu cũ trong nhiều trường hợp có thể được nhiều tồi tệ hơn ném một lỗi.
Phil Sandler

1
@eithed Tôi đã đề cập đến nhận xét này: "Tuy nhiên, nếu chúng tôi muốn theo dõi các thay đổi đối với danh mục, điều đó cũng đòi hỏi phải tìm nguồn cung ứng sự kiện". Trong mọi trường hợp, bạn có ý tưởng đúng - dịch vụ Sản phẩm phải chịu trách nhiệm theo dõi các thay đổi theo thời gian, không phải dịch vụ hạ nguồn.
Phil Sandler

1
Ngoài ra, lưu trữ dữ liệu mà bạn quan sát, trong khi nó có một số điểm tương đồng với bộ nhớ đệm, nó không thể hiện các vấn đề tương tự. Cụ thể hơn, không cần thiết phải có hiệu lực; bạn nhận được phiên bản mới của dữ liệu khi nó xảy ra. Những gì bạn trải nghiệm là sự nhất quán chậm trễ. Tuy nhiên, ngay cả khi sử dụng yêu cầu web cũng có một cửa sổ không nhất quán (mặc dù là một cửa sổ nhỏ).
Savvas Kleanthous

1
@SavvasKleanthous Trong mọi trường hợp, quan điểm chính của tôi là không cố gắng giải quyết các vấn đề chưa tồn tại, đặc biệt là với các giải pháp mang lại các vấn đề và rủi ro của riêng họ. Tùy chọn 2 là giải pháp đơn giản nhất và nó phải là lựa chọn mặc định cho đến khi nó không đáp ứng yêu cầu kinh doanh . Nếu bạn nghĩ rằng việc chọn giải pháp đơn giản nhất có thể làm việc là (như bạn nói) thì "thực sự tồi tệ", thì tôi nghĩ chúng ta chỉ không đồng ý.
Phil Sandler

2

Rất khó để nói một giải pháp tốt hơn giải pháp kia. Việc chọn một trong số Giải pháp số 2 và số 3 phụ thuộc vào các yếu tố khác (thời lượng bộ đệm, dung sai tính nhất quán, ...)

2 xu của tôi:

Vô hiệu hóa bộ đệm có thể khó khăn nhưng báo cáo vấn đề đề cập rằng danh mục sản phẩm hiếm khi thay đổi. Thực tế này làm cho dữ liệu sản phẩm trở thành một ứng cử viên tốt cho bộ nhớ đệm

Giải pháp số 1 (NOK)

  • Dữ liệu được nhân đôi trên nhiều hệ thống

Giải pháp số 2 (OK)

  • Cung cấp sự nhất quán mạnh mẽ
  • Chỉ hoạt động khi dịch vụ sản phẩm có sẵn cao và cung cấp hiệu suất tốt
  • Nếu dịch vụ email chuẩn bị một bản tóm tắt (có nhiều sản phẩm), thì thời gian phản hồi tổng thể có thể lâu hơn

Giải pháp số 3 (Phức tạp nhưng được ưu tiên)

  • Thích cách tiếp cận API thay vì truy cập DB trực tiếp để lấy thông tin sản phẩm
  • Khả năng phục hồi - dịch vụ tiêu thụ không bị ảnh hưởng khi dịch vụ sản phẩm ngừng hoạt động
  • Các ứng dụng tiêu dùng (dịch vụ vận chuyển và email) lấy thông tin chi tiết về sản phẩm ngay sau khi một sự kiện được công bố. Khả năng dịch vụ sản phẩm đi xuống trong vài mili giây này là rất xa.

1

Nói chung, tôi thực sự khuyên bạn nên chống lại tùy chọn 2 vì sự kết hợp tạm thời giữa hai dịch vụ này (trừ khi giao tiếp giữa các dịch vụ này siêu ổn định và không thường xuyên lắm). Khớp nối tạm thời là những gì bạn mô tả this makes B and C dependant upon A (at all times)và có nghĩa là nếu A không hoạt động hoặc không thể truy cập được từ B hoặc C, B và C không thể thực hiện được chức năng của chúng.

Cá nhân tôi tin rằng cả hai tùy chọn 1 và 3 đều có tình huống là các tùy chọn hợp lệ.

Nếu giao tiếp giữa A và B & C quá cao hoặc lượng dữ liệu cần thiết để tham gia sự kiện đủ lớn để khiến nó lo ngại, thì tùy chọn 3 là lựa chọn tốt nhất, vì gánh nặng trên mạng thấp hơn nhiều và độ trễ của hoạt động sẽ giảm khi kích thước thư giảm. Các mối quan tâm khác cần xem xét ở đây là:

  1. Tính ổn định của hợp đồng: nếu hợp đồng gửi tin nhắn A thay đổi thường xuyên, thì việc đưa nhiều tài sản vào tin nhắn sẽ dẫn đến nhiều thay đổi trong người tiêu dùng. Tuy nhiên, trong trường hợp này tôi tin rằng đây không phải là một vấn đề lớn vì:
    1. Bạn đã đề cập rằng hệ thống A là một CMS. Điều này có nghĩa là bạn đang làm việc trên một miền ổn định và vì vậy tôi không tin rằng bạn sẽ thấy những thay đổi thường xuyên
    2. Vì B và C đang vận chuyển và gửi email, và bạn đang nhận dữ liệu từ A, tôi tin rằng bạn sẽ trải qua các thay đổi phụ gia thay vì phá vỡ, an toàn để thêm bất cứ khi nào bạn phát hiện ra chúng mà không cần làm lại.
  2. Khớp nối: Có rất ít hoặc không có khớp nối ở đây. Đầu tiên vì việc liên lạc qua tin nhắn, không có sự kết hợp nào giữa các dịch vụ ngoài thời gian ngắn trong quá trình gieo dữ liệu và hợp đồng của hoạt động đó (không phải là khớp nối mà bạn có thể hoặc nên cố gắng tránh)

Tùy chọn 1 không phải là một cái gì đó tôi bỏ qua mặc dù. Có cùng số lượng khớp nối, nhưng khôn ngoan về phát triển nên dễ thực hiện (không cần hành động đặc biệt) và tính ổn định của miền sẽ có nghĩa là những điều này sẽ không thay đổi thường xuyên (như tôi đã đề cập).

Một tùy chọn khác mà tôi đề xuất là một biến thể nhỏ thành 3, không chạy quy trình trong quá trình khởi động, mà thay vào đó hãy quan sát sự kiện "ProductAdded và" ProductDetailsChanged "trên B và C, khi có sự thay đổi trong danh mục sản phẩm trong A. Điều này sẽ giúp việc triển khai của bạn nhanh hơn (và do đó dễ dàng hơn để khắc phục sự cố / lỗi nếu bạn tìm thấy bất kỳ).


Chỉnh sửa 2020/03/03

Tôi có một thứ tự ưu tiên cụ thể khi xác định phương pháp tích hợp:

  1. Chi phí nhất quán là gì? Chúng ta có thể chấp nhận một vài phần nghìn giây không thống nhất giữa những thứ thay đổi trong A và chúng được phản ánh trong B & C không?
  2. Bạn có cần truy vấn theo thời gian (còn gọi là truy vấn tạm thời) không?
  3. Có bất kỳ nguồn sự thật cho dữ liệu? Một dịch vụ sở hữu chúng và được coi là thượng nguồn?
  4. Nếu có một chủ sở hữu / nguồn duy nhất của sự thật là ổn định? Hay chúng ta mong đợi để thấy những thay đổi phá vỡ thường xuyên?

Nếu chi phí không thống nhất cao, (về cơ bản dữ liệu sản phẩm trong A cần nhất quán càng sớm càng tốt với sản phẩm được lưu trong bộ nhớ cache trong B và C), thì bạn không thể tránh việc chấp nhận không thể chấp nhận và đưa ra yêu cầu đồng bộ (như web / phần còn lại yêu cầu) từ B & C đến A để lấy dữ liệu. Hãy nhận biết! Điều này vẫn không có nghĩa là nhất quán trong giao dịch, mà chỉ thu nhỏ các cửa sổ cho sự không nhất quán. Nếu bạn hoàn toàn, tích cực phải nhất quán ngay lập tức, bạn cần phải kiểm tra lại ranh giới dịch vụ của mình. Tuy nhiên, tôi rất tin tưởng rằng đây không phải là một vấn đề. Từ kinh nghiệm, thực sự rất hiếm khi công ty không thể chấp nhận một vài giây không nhất quán, do đó bạn thậm chí không cần phải thực hiện các yêu cầu đồng bộ.

Nếu bạn cần truy vấn theo thời gian (mà tôi không nhận thấy trong câu hỏi của bạn và do đó không bao gồm ở trên, có thể sai), chi phí duy trì điều này trên các dịch vụ hạ nguồn là rất cao (bạn cần phải nhân đôi logic chiếu sự kiện nội bộ trong tất cả các dịch vụ hạ nguồn) giúp đưa ra quyết định rõ ràng: bạn nên để quyền sở hữu cho A và truy vấn A ad-hoc qua yêu cầu web (hoặc tương tự) và A nên sử dụng tìm nguồn cung ứng sự kiện để truy xuất tất cả các sự kiện bạn biết về tại thời điểm để dự án cho nhà nước, và trả lại nó. Tôi đoán đây có thể là tùy chọn 2 (nếu tôi hiểu chính xác?), Nhưng chi phí là như vậy trong khi khớp nối tạm thời tốt hơn chi phí bảo trì của các sự kiện song công và logic chiếu.

Nếu bạn không cần một thời điểm và không có chủ sở hữu duy nhất của dữ liệu (mà trong câu trả lời ban đầu của tôi, tôi đã giả sử điều này dựa trên câu hỏi của bạn), thì một mô hình rất hợp lý sẽ là giữ các biểu diễn của sản phẩm trong từng dịch vụ riêng biệt. Khi bạn cập nhật dữ liệu cho các sản phẩm, bạn cập nhật song song A, B và C bằng cách thực hiện các yêu cầu web song song cho từng người hoặc bạn có API lệnh gửi nhiều lệnh cho mỗi A, B và C. B & C sử dụng phiên bản cục bộ của dữ liệu để thực hiện công việc của họ, có thể hoặc không thể cũ. Đây không phải là bất kỳ tùy chọn nào ở trên (mặc dù có thể được thực hiện gần với tùy chọn 3), vì dữ liệu trong A, B và C có thể khác nhau và "toàn bộ" sản phẩm có thể là một thành phần của cả ba dữ liệu nguồn.

Biết được nguồn gốc của sự thật có hợp đồng ổn định có hữu ích không vì bạn có thể sử dụng nó để sử dụng miền / sự kiện nội bộ (hoặc sự kiện bạn lưu trữ trong nguồn cung cấp sự kiện của mình làm mẫu lưu trữ trong A) để tích hợp trên A và dịch vụ B và C. Nếu hợp đồng ổn định, bạn có thể tích hợp thông qua các sự kiện tên miền. Tuy nhiên, sau đó bạn có thêm một mối quan tâm trong trường hợp thay đổi thường xuyên hoặc hợp đồng tin nhắn đó đủ lớn để khiến việc vận chuyển trở thành mối lo ngại.

Nếu bạn có một chủ sở hữu rõ ràng, với một biện pháp tránh thai được dự kiến ​​là ổn định, các tùy chọn tốt nhất sẽ là tùy chọn 1; một đơn đặt hàng sẽ chứa tất cả thông tin cần thiết và sau đó B và C sẽ thực hiện chức năng của họ bằng cách sử dụng dữ liệu trong sự kiện.

Nếu hợp đồng có thể thay đổi hoặc phá vỡ thường xuyên, theo tùy chọn 3 của bạn, đó là quay lại các yêu cầu web để lấy dữ liệu sản phẩm thực sự là một lựa chọn tốt hơn, vì việc duy trì nhiều phiên bản dễ dàng hơn nhiều. Vì vậy, B sẽ đưa ra yêu cầu trên v3 của sản phẩm.


Yup, tôi đồng ý. Mặc dù ProductAddedhoặc ProductDetailsChangedthêm độ phức tạp của việc theo dõi thay đổi danh mục sản phẩm, chúng tôi cần giữ dữ liệu được đồng bộ hóa giữa các cơ sở dữ liệu theo một cách nào đó, trong trường hợp các sự kiện được phát lại và chúng tôi cần truy cập dữ liệu danh mục từ quá khứ.
thúc ngày

@eithed Tôi đã cập nhật câu trả lời để mở rộng về một số giả định tôi đã thực hiện.
Savvas Kleanthous
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.