Làm thế nào một lệnh nên có dạng hạt trong mô hình CQ [R] S?


17

Tôi đang xem xét một dự án để di chuyển một phần của SOA dựa trên WCF của chúng tôi sang mô hình bus dịch vụ (có thể là nServiceBus) và sử dụng một số pub-sub cơ bản để đạt được Phân tách truy vấn lệnh .

Tôi không phải là người mới đối với SOA, hoặc thậm chí với các mô hình xe buýt dịch vụ, nhưng tôi thú nhận rằng cho đến gần đây, khái niệm "phân tách" của tôi chỉ giới hạn ở việc sao chép và nhân rộng cơ sở dữ liệu. Tuy nhiên, tôi bị thu hút bởi ý tưởng này vì nó dường như cung cấp tất cả các lợi ích của một hệ thống phù hợp cuối cùng trong khi bỏ qua nhiều nhược điểm rõ ràng (đáng chú ý nhất là thiếu hỗ trợ giao dịch phù hợp).

Tôi đã đọc rất nhiều về chủ đề từ Udi Dahan, người về cơ bản bậc thầy về kiến ​​trúc ESB (ít nhất là trong thế giới của Microsoft), nhưng có một điều ông nói thực sự đánh đố tôi:

Khi chúng ta có được các thực thể lớn hơn với nhiều trường hơn trên chúng, chúng ta cũng có nhiều tác nhân làm việc với cùng các thực thể đó và khả năng một cái gì đó sẽ chạm vào một số thuộc tính của chúng tại bất kỳ thời điểm nào, làm tăng số lượng xung đột đồng thời.

[...]

Một yếu tố cốt lõi của CQRS là xem xét lại thiết kế giao diện người dùng để cho phép chúng tôi nắm bắt ý định của người dùng để làm cho khách hàng ưa thích là một đơn vị công việc khác cho người dùng so với việc khách hàng đã di chuyển hoặc họ đã nhận được cưới nhau. Sử dụng giao diện người dùng giống như Excel để thay đổi dữ liệu không nắm bắt được mục đích, như chúng ta đã thấy ở trên.

- Udi Dahan, CQRS làm rõ

Từ quan điểm được mô tả trong trích dẫn, thật khó để tranh luận với logic đó. Nhưng nó dường như đi ngược lại hạt giống đối với các SOA. Một SOA (và các dịch vụ thực sự nói chung) được cho là để đối phó với các thông điệp chi tiết thô để giảm thiểu trò chuyện mạng - trong số nhiều lợi ích khác.

Tôi nhận ra rằng trò chuyện trong mạng ít gặp vấn đề hơn khi bạn có các hệ thống phân tán cao với hàng đợi tin nhắn tốt và không có hành lý nào của RPC, nhưng có vẻ không khôn ngoan khi loại bỏ hoàn toàn vấn đề. Udi dường như đang nói rằng mọi thay đổi thuộc tính (tức là cập nhật trường) phải là lệnh riêng của nó, thật khó tưởng tượng trong bối cảnh một người dùng có khả năng cập nhật hàng trăm hoặc hàng ngàn thực thể và thuộc tính kết hợp như thường thấy với một truyền thống dịch vụ web.

Một bản cập nhật hàng loạt trong SQL Server có thể mất một phần giây trong một truy vấn được tham số hóa tốt, tham số có giá trị bảng hoặc chèn số lượng lớn vào bảng phân tầng; xử lý tất cả các cập nhật này cùng một lúc là chậm, chậm, chậm và phần cứng cơ sở dữ liệu OLTP là tốn kém nhất trong tất cả các quy mô tăng / giảm.

Có cách nào để hòa giải những mối quan tâm cạnh tranh này? Tôi đang nghĩ về nó sai cách? Vấn đề này có một giải pháp nổi tiếng trong thế giới CQS / ESB không?

Nếu không, làm thế nào để người ta quyết định "mức độ đúng" của độ chi tiết trong một Lệnh sẽ là gì? Có một số "tiêu chuẩn" nào đó có thể được sử dụng làm điểm bắt đầu - giống như 3NF trong cơ sở dữ liệu - và chỉ đi chệch hướng khi hồ sơ cẩn thận cho thấy lợi ích hiệu suất đáng kể?

Hay đây có thể là một trong những điều mà, mặc dù có nhiều ý kiến ​​mạnh mẽ được đưa ra bởi các chuyên gia khác nhau, thực sự chỉ là vấn đề quan điểm?

Câu trả lời:


7

Về chủ đề "mọi thay đổi thuộc tính"

Tôi nghĩ rằng bạn bị mất điểm. Ông Udi Dahan đang nói rằng bạn nên nắm bắt ý định của người dùng như một mệnh lệnh. Một người dùng cuối quan tâm đến việc có thể chỉ ra rằng một khách hàng đã di chuyển. Tùy thuộc vào ngữ cảnh mà lệnh có thể chứa thông tin nhận dạng khách hàng, địa chỉ mới (được chia thành đường phố, số đường phố, mã zip, ...), tùy chọn một số điện thoại mới (không phổ biến khi bạn di chuyển - có thể ít hơn với tất cả các điện thoại di động này) . Đó hầu như không phải là một thuộc tính. Một câu hỏi tốt hơn là "làm thế nào để tôi thiết kế các lệnh?". Bạn thiết kế chúng từ một quan điểm hành vi. Mỗi trường hợp sử dụng, luồng, tác vụ mà người dùng cuối đang cố gắng hoàn thành, sẽ được ghi lại trong một hoặc nhiều lệnh. Dữ liệu đi với những lệnh đó xuất hiện một cách tự nhiên, khi bạn bắt đầu suy luận về chúng chi tiết hơn. Điều cần chú ý là dữ liệu được hiểu là "có thể là một dấu hiệu cho thấy bạn cần phải tách lệnh. Tôi hy vọng bạn không bao giờ tìm thấy tiêu chuẩn đó liên quan đến độ chi tiết của lệnh. Câu hỏi hay!


Định nghĩa này vẫn cảm thấy rất độc đoán với tôi; mô hình khái niệm của CSR có thể gộp trạng thái ưa thích và trạng thái võ thuật giống như cách bạn gộp địa chỉ và mã bưu điện lại với nhau. Tôi không có ý định chia tóc, đối với tôi, dường như để thực sự hiểu nếu chúng là những hành vi khác nhau, bạn phải dự đoán được các hiệu ứng xuôi dòng và OTOH toàn bộ ý tưởng về ESB và CQS và pub / phụ là bạn không cần phải biết hoặc quan tâm đến những gì xảy ra ở hạ lưu. Cảm ơn câu trả lời của bạn, tôi đánh giá cao nó, mặc dù tôi không thể nói rằng tôi cảm thấy được giác ngộ nhiều hơn cho đến nay ...
Aaronaught

@Aaronaught: Định nghĩa tùy ý. Độ chi tiết của Lệnh sẽ là bất cứ điều gì có ý nghĩa đối với kịch bản cụ thể của bạn . Không có một kích thước phù hợp với tất cả. Có một số nguyên tắc, chẳng hạn như các lệnh khớp để sử dụng các trường hợp hoặc tác vụ hoặc hành động có sẵn trong giao diện người dùng - một cách khác là thích các lệnh chi tiết hơn các lệnh ít chi tiết hơn (cụ thể như Yves nói là cảnh giác với dữ liệu được hiểu là luồng điều khiển logic) - nhưng không có quy tắc cứng và nhanh. Có một kịch bản thực tế trong đó "một người dùng có khả năng cập nhật hàng trăm hoặc hàng ngàn thực thể và thuộc tính kết hợp" không?
quentin-starin

Đó là toàn bộ vấn đề! Đừng gộp lại với nhau. Chia theo hành vi! Không đặt dữ liệu vào lệnh không phù hợp với mục đích của lệnh / người dùng cuối. Và đó không phải là về hệ thống hạ nguồn.
Yves Reynhout

@qes: Trong các hệ thống của chúng tôi có một số kịch bản như vậy, rất thực tế và rất cần thiết. Để nói một cách đơn giản nhất có thể, họ cần sửa đổi toàn bộ chuỗi dữ liệu và các chuỗi này chỉ có ý nghĩa như các chuỗi. Tất nhiên họ thường không ghi lại những thay đổi này bằng cách ghi lại, họ áp dụng một số thuật toán cho phần lớn của nó và sau đó sửa một vài ngoại lệ. Có thể đây không phải là một kịch bản phù hợp cho CQS để bắt đầu, nhưng quyết định đó chỉ là một phần nhỏ trong câu hỏi rộng hơn của tôi.
Aaronaught

1
@qes: Đủ công bằng, và đó là một câu trả lời trong chính nó. Tôi chắc chắn hiểu khái niệm về một hoạt động hợp lý (đó là cách các dịch vụ hiện tại được mô hình hóa), tôi đoán tôi đã lo ngại rằng CQS dường như thay đổi một số quy tắc xung quanh cách bạn nên xác định một hoạt động. SOA "truyền thống" dường như bắt đầu từ định nghĩa thô nhất có thể và chuyển xuống thang trừu tượng nếu cần thiết; sự hiểu biết của tôi về CQS cho đến nay dường như chỉ ra điều ngược lại, bắt đầu từ định nghĩa chi tiết nhất có thể và trừu tượng nếu nó trông quá giống RPC hoặc luồng điều khiển.
Aaronaught

2

Thông điệp mà Udi đang cố gắng vượt qua là CQRS không chỉ là CRUD. Tại sao tôi tạo hồ sơ này? Tại sao tôi thay đổi hồ sơ này? Tại sao nó bị xóa / đánh dấu là đã xóa?

Các lệnh nên tương ứng với các hành động / trường hợp sử dụng mà người dùng thực hiện với hệ thống và thể hiện ý định của hành động thay vì chỉ nói thay đổi điều này. Ngoài ra, nó có vẻ như hạt mịn hơn nhưng nó có thể thô hơn nhiều so với lần đầu tiên xuất hiện. Ví dụ, việc nâng cấp lên trạng thái vàng có thể liên quan đến thay đổi một số thuộc tính và một số tập hợp khác thậm chí có thể phản hồi và thay đổi để đáp ứng với sự kiện tương ứng.

CQRS nói về việc nắm bắt ngôn ngữ của doanh nghiệp trong lớp Dịch vụ để UI không phải lo lắng về những gì xảy ra khi tôi thực hiện nâng cấp trạng thái vàng hoặc lô hàng đã được nhà vận chuyển đánh dấu là không thể gửi được hoặc nhân viên đã được thăng chức để quản lý nhóm công nghệ. Về mặt kỹ thuật tôi đang nói về Tìm nguồn cung ứng sự kiện ngay bây giờ nhưng bạn sẽ hiểu được. Có nhiều thông điệp khác biệt nhưng chúng không nhất thiết phải mịn hơn CUD tiêu chuẩn.

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.