Одним из основных принципов разработки сервисов SOA является принцип составности сервисов ( https://en.wikipedia.org/wiki/Service_composability_principle ).
Идея состоит в том, что, составляя новые сервисы, используя существующие в качестве строительных блоков, можно быстро разрабатывать новые сервисы. Вид аналогично тому, как вы вызываете существующие методы объектов при реализации новых методов. Отсюда и значительный прирост производительности от SOA.
Кто-то действительно делает это на практике? Я видел это бесконечно повторяющееся в письменном тексте, но сам не сталкивался с реализацией в реальном мире. В большей части текста также отсутствует упоминание об обработке транзакций , что, как мне кажется, является самым большим препятствием в реализации составных сервисов.
Во-первых, вам действительно нужно решить проблему транзакций, прежде чем вы сможете создавать какие-либо нетривиальные сервисы. Конечно, если в примере есть сервисы "findCurrentTime ()" и "writeLogMessage ()", легко не беспокоиться о транзакциях, но не при наличии реальных примеров, таких как "depositMoney ()" и "drawMoney () ".
Я знаю два варианта:
- Реализация реальных транзакций с помощью WS-Atomic Transaction или подобных
- Внедрить решение на основе компенсации, которое компенсирует вызов A с помощью метода "cancelA ()" или, например, в случае сбоя вызова B
Оба из них кажутся мне очень проблематичными / почти непригодными для использования:
- WS-Атомная транзакция
- много сложности, большинство совета , который я нашел только предупреждает «боль в заднице, не делает это»
- поддержка ограничена, например, если вы берете ESB с открытым исходным кодом, основные альтернативы ServiceMix, Mule или WSO2 не поддерживают его
- компенсации
- реализация обработки компенсаций кажется мне очень сложной. Что мы делаем, если служба A преуспевает, и мы никогда не получаем ответ от службы B и не знаем, провалилась ли она или преуспела? Ручная обработка такой логики (как реализации сервисов компоновки) заставляет меня хотеть разрезать мои запястья - это та работа, которую какой-то инструмент должен сделать для меня !.
- Я также не понимаю, как у вас могут быть методы компенсации в нетривиальных услугах. Скажем, ваш сервис A - это «depositMoney ()», и он успешно выполняется, какое-то другое действие быстро переводит деньги в другое место, и затем мы получаем «undateDepositMoney () », что нам теперь делать? Похоже, большая банка червей.
Мне кажется, что состав сервисов является настолько фундаментальным принципом SOA, что вы действительно не получаете преимуществ SOA, если не можете (удобно) создавать сервисы . Какова реальность? 90% пользователей SOA используют "SOA" с грифом без реальной поддержки сервиса? Или большинство пользователей на самом деле используют состав услуг, и я преувеличиваю сложность этого?