Một trong những nguyên tắc thiết kế dịch vụ chính của SOA là nguyên tắc Khả năng kết hợp dịch vụ ( https://en.wikipedia.org/wiki/Service_composability_principl ).
Ý tưởng là bằng cách kết hợp các dịch vụ mới bằng cách sử dụng các dịch vụ hiện có làm các khối xây dựng, người ta có thể nhanh chóng phát triển các dịch vụ mới. Kiểu tương tự như cách bạn gọi các phương thức hiện tại của các đối tượng khi bạn thực hiện các phương thức mới. Đây là nơi mà phần lớn tăng năng suất từ SOA được cho là đến từ.
Có ai thực sự làm điều này trong thực tế? Tôi đã thấy điều này lặp đi lặp lại vô tận trong văn bản bằng văn bản, nhưng bản thân tôi chưa có kinh nghiệm triển khai thế giới thực. Hầu hết các văn bản cũng bỏ qua bất kỳ đề cập nào về xử lý giao dịch , dường như là trở ngại lớn nhất trong việc hiện thực hóa các dịch vụ có thể kết hợp.
Đầu tiên, bạn thực sự cần phải giải quyết vấn đề giao dịch trước khi bạn có thể soạn bất kỳ dịch vụ không tầm thường nào. Chắc chắn, nếu ví dụ này có các dịch vụ "findCienTime ()" và "writeLogMessage ()" thì bạn không dễ lo lắng về các giao dịch, nhưng không phải khi có các ví dụ trong thế giới thực như "DepositMoney ()" và "drawMoney () ".
Tôi biết hai lựa chọn:
- Thực hiện các giao dịch thực với Giao dịch nguyên tử WS hoặc tương tự
- Thực hiện giải pháp dựa trên bù mà bù cho cuộc gọi đến A bằng "CancA ()" hoặc somesuch nếu cuộc gọi đến B không thành công
Cả hai điều này dường như rất có vấn đề / gần với không thể sử dụng với tôi:
- Giao dịch nguyên tử WS
- một nhiều phức tạp, hầu hết các lời khuyên mà tôi tìm thấy chỉ cảnh báo "cơn đau ở ass, dont làm điều đó"
- hỗ trợ bị hạn chế, ví dụ: nếu bạn sử dụng ESB nguồn mở, các lựa chọn thay thế chính ServiceMix, Mule hoặc WSO2 không hỗ trợ
- bồi thường
- thực hiện việc xử lý bồi thường có vẻ rất phức tạp đối với tôi. Chúng ta phải làm gì nếu dịch vụ A thành công và chúng ta không bao giờ nhận được câu trả lời từ dịch vụ B và không biết liệu nó có thất bại hay thành công không? Xử lý logic như vậy bằng tay (với tư cách là người triển khai các dịch vụ tổng hợp) khiến tôi muốn rạch cổ tay - đây là công việc mà một số công cụ nên làm cho tôi!.
- Tôi cũng không thấy làm thế nào bạn có thể có các phương thức bồi thường trong các dịch vụ không tầm thường. Giả sử dịch vụ của bạn A là "DepositMoney ()" và thành công, một số hành động khác nhanh chóng chuyển tiền đi nơi khác và sau đó chúng tôi nhận được "offsetDepositMoney ()", chúng ta phải làm gì bây giờ? Có vẻ như một lon giun lớn.
Đối với tôi, dường như thành phần dịch vụ là một nguyên tắc cơ bản của SOA đến nỗi bạn thực sự không nhận được lợi ích của SOA nếu bạn không thể (thuận tiện) soạn các dịch vụ . Thực tế là gì? 90% người dùng SOA sử dụng "SOA bị tê liệt" mà không có sự đồng bộ hóa dịch vụ thực sự? Hoặc hầu hết người dùng thực tế sử dụng thành phần dịch vụ và tôi đang phóng đại sự khó khăn của nó?