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 là 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?