Одним з головних принципів проектування послуг SOA є принцип сумісності послуг ( https://en.wikipedia.org/wiki/Service_composability_principle ).
Ідея полягає в тому, що, складаючи нові сервіси, використовуючи існуючі як будівельні блоки, можна швидко розвивати нові сервіси. Вигляд аналогічний тому, як ви називаєте існуючі методи об’єктів, коли реалізуєте нові методи. Ось звідки, як передбачається, відбудеться значне підвищення продуктивності SOA.
Хтось справді робить це на практиці? Я бачив це нескінченно повтореним у письмовому тексті, але сам не відчував реальної реалізації реального світу. Більша частина тексту також не містить будь-яких згадок про операції з транзакціями , що, як мені здається, є найбільшою перешкодою у здійсненні послуг з компонування.
По-перше, вам справді потрібно вирішити проблему транзакцій, перш ніж ви зможете створити будь-які нетривіальні послуги. Звичайно, якщо в прикладі є служби "findCurrentTime ()" і "writeLogMessage ()", то легко не турбуватися про транзакції, але не мати прикладів реального світу, таких як "depositMoney ()" і "pullMoney ()".
Я знаю два варіанти:
- Реалізуйте реальні транзакції за допомогою WS-Atomic Transaction або іншого
- Реалізуйте рішення на основі компенсації, яке компенсує виклик A з "cancelA ()" або дещо, якщо виклик B не вдається
І те й інше здається дуже проблематичним / близьким до непридатного для мене:
- WS-атомна транзакція
- багато складності, більшість ради , який я знайшов тільки попереджає «біль в дупі, не робить це»
- підтримка обмежена, наприклад, якщо ви приймаєте ESB з відкритим кодом, основні альтернативи ServiceMix, Mule або WSO2 не підтримують її
- компенсації
- реалізація управління компенсаціями здається мені дуже складною. Що ми робимо, якщо послуга A успішна, і ми ніколи не отримуємо відповіді від служби B і не знаємо, чи не вдалося це чи вдалося? Поводження з такою логікою вручну (як виконавець служб складання композицій) змушує мене розрізати зап’ястя - це така робота, яку повинен зробити для мене інструмент !.
- Я також не бачу, як можна використовувати методи компенсації в нетривіальних послугах. Скажіть, що ваша послуга A - "depositMoney ()", і це вдається, а деякі інші дії швидко переносять гроші в інше місце, і тоді ми отримуємо "компенсаціюDepositMoney ()", що ми робимо зараз? Схоже на велику банку глистів.
Мені здається, що склад сервісу - це такий фундаментальний принцип SOA, що ви дійсно не отримуєте переваг SOA, якщо не можете (зручно) складати послуги . Яка реальність? 90% користувачів SOA використовують "покалічене SOA" без реального службового складу? Або більшість користувачів насправді використовують сервісну композицію, і я перебільшую складність цього?