Как вы можете эффективно использовать веб-сервисы в корпоративной среде, если вы не можете использовать транзакции?


14

Место, где я работаю, - это попытаться установить некоторые основные правила, и сейчас мы ведем дебаты о том, что локальные библиотеки против веб-сервисов для повторного использования кода. Веб-сервисы, кажется, популярны в большинстве компаний, и именно к этому склоняется большинство разработчиков.

Я просто не понимаю, как можно эффективно использовать веб-сервисы для любой серьезной работы. Как я могу безопасно выполнить несколько вызовов службы, если я не могу использовать транзакцию?

Допустим, у меня есть работа cron, которая отбирает клиентов из нашей базы данных, которые удовлетворяют определенному условию, о котором они должны быть уведомлены. Им отправляется факс, электронное письмо, и создается билет для внутреннего отслеживания проблемы. Это 3 разных сервисных вызова, которые будут происходить для каждого клиента в цикле for.

Если где-то там происходит ошибка, возможно, что, например, факс и электронная почта отправлены клиенту, но билет не создан. Или, что еще хуже, это задание cron может содержать ошибку, из-за которой оно каждый раз приводит к сбою в одной и той же точке и постоянно отправляет электронное письмо одному и тому же клиенту. Если бы все библиотеки были локальными, все можно было просто обернуть в транзакцию, и ничего из этого не произошло бы. Но мы используем веб-сервисы в этом примере.

Обратите внимание, что методы электронной почты и факса фактически вставляют данные в таблицы очередей на основе базы данных, которые, в свою очередь, обрабатываются отдельным процессом задания cron. Таким образом, вызовы методов «отправить электронную почту» и «отправить факс» могут быть отменены без побочных эффектов, если это необходимо.

Один из вариантов - поместить весь этот кусок кода в сам веб-сервис, чтобы сам веб-сервис вызывал в транзакции методы создания электронной почты, факса и билетов. Но затем мы создаем метод веб-сервиса только для использования транзакции; нет никаких веских причин, по которым нам когда-либо нужно было бы вызывать этот метод из любой точки, кроме одного скрипта cron.

Как бы вы вообще справились с этим методом?


Чтобы дать полный ответ, мне нужно больше информации. Есть много вещей, которые следует учитывать при переходе на сервис-ориентированную архитектуру. Например, есть ли у вас гетерогенная (разные языки и платформы) или однородная (один язык и платформа) среда. У вас есть система сервисных автобусов? Если нет, то планируете ли вы его реализовать? Как вы планируете получить доступ к вашим услугам (Интранет с одним местоположением, WAN с несколькими местоположениями, распределенный клиент, использующий API-интерфейс общедоступного сервиса). Существует ряд переменных, которые влияют на «оптимальное» решение.
Майкл Браун

@MikeBrown: все сервисы будут написаны на одном языке, но будут использоваться несколькими платформами. Мы понятия не имеем о внедрении EBS, мы даже не начали какую-либо работу по обслуживанию, поэтому все возможно. Услуги будут в основном потребляться внутри нашей локальной сети, но некоторые из них должны быть общедоступными для мобильных приложений.
Ryeguy

«Если бы все библиотеки были локальными, все можно было просто обернуть в транзакцию, и ничего из этого не произошло бы». Ложь. Ошибка может возникнуть после отправки электронного письма, но до последнего обновления базы данных. Транзакция не препятствует обратной связи по электронной почте или факсу.
S.Lott

@ S.Lott: Это так, потому что вызовы службы электронной почты и факса фактически просто вставляют их в очередь, которая доставляется другим процессом. Если транзакция, которую я описал выше, произошла, вставка очереди будет прервана.
Ryeguy

1
@ryeguy: пожалуйста, обновите вопрос. Пожалуйста, не добавляйте комментарии к вопросу. Это важная часть вашей архитектуры. Пожалуйста, раскрыть это в вопросе.
S.Lott

Ответы:


5

На самом деле вы описываете распределенную транзакцию, реализующую двухфазную фиксацию . Некоторые корпоративные платформы обмена сообщениями включают в себя диспетчеры транзакций для поддержки такого рода вещей, но конкретные продукты зависят от платформы / языка. У меня нет конкретного опыта работы с такими инструментами, но надеюсь, что эти указатели помогут.


3

Интересно, что, поскольку я участвую в этом конкретном вопросе и ответах, существует похожая тема об услугах, поддерживающих несколько платформ, в списке рассылки DDD / CQRS, в котором я участвую. Я могу повторить некоторые из моих советов здесь.

Одним из вариантов поддержки транзакций в гетерогенной среде является использование транспортного механизма, который поддерживает транзакции и поддерживается на всех платформах, с которых он будет использоваться. Advanced Message Queue Protocol (AMQP) делает поддержку транзакции и есть родная API для почти любого языка , который обычно используется сегодня. RabbitMQ - это сервер, который реализует AMQP и был проверен в отрасли как надежное решение.

Использование системы, основанной на RabbitMQ, позволит вам получить полноценный ESB, если вам понадобится развиваться. Вы публикуете сообщения на канал и подписываетесь на очередь. То, что становится действительно мощным, - это то, что между каналом и очередью вы можете выполнить много интересного. Канал может передавать несколько очередей (pub / sub), очередь может передаваться несколькими каналами, вы можете направлять сообщения в разные очереди в зависимости от содержимого и т. Д. И т. Д.

Я только что читал об альтернативах транзакциям (которые идут с накладными расходами и превращают асинхронную операцию в блокирующую операцию). RabbitMQ поддерживает так называемое подтверждение издателя . По сути, это позволяет зарегистрировать обратный вызов для опубликованного метода для обработки неудачной транзакции. В вашем случае это может отменить запросы электронной почты / факса и удалить билет.

Конечно, кроличья нора (простите за каламбур) идет еще глубже оттуда. Вы можете использовать Rabbit для создания сложных оркестровок как с внутренними, так и с внешними веб-сервисами.

Для ваших общедоступных веб-сервисов все становится просто. Ваша служба (будь то SOAP, REST или JSON) просто публикует сообщение в соответствующей очереди службы и позволяет внутренней системе обрабатывать его оттуда.

Также есть функциональность для создания сообщения запроса / ответа для тех сценариев, где вы ожидаете быстрого получения информации.


2

Ключевые слова, которые вы ищете, - «хореография веб-сервисов».

Проверьте статью Wikipedia об этом.


Иногда также называется "оркестровка".
S.Lott

1

То, как я справился с этим в приложении-сервисе, которое я написал, заключалось в создании оболочки для обработки необходимых транзакций. В моем случае пользовательский запрос, сделанный веб-сайтом, настольным приложением или службой Windows, должен был запросить веб-службу и, в зависимости от результата и параметров пользователя, он должен был обновить локальную БД и, при необходимости, удаленную. через веб-сервис. Затем он должен был создать отчет, который должен быть немедленно возвращен, отправлен по электронной почте и / или отправлен по факсу. У меня был контроль над локальной базой данных, электронной почтой и генерацией отчетов, но я не управлял веб-службами или факс-сервером.

Создание оболочки позволило улучшить контроль транзакций и обработку ошибок. Это также позволило повысить безопасность, контролируя доступ к внутренним сетевым службам из внешних источников. В целом, я вижу необходимость в транзакциях и управлении службой в качестве веской причины для создания подходящей оболочки для одного решения, если код используется повторно должным образом (без кодирования «вырезать и вставить»).


1

Я просто не понимаю, как можно эффективно использовать веб-сервисы для любой серьезной работы. Как я могу безопасно выполнить несколько вызовов службы, если я не могу использовать транзакцию?

Ты не можешь

Вопрос, который вы должны задать: как мне реализовать транзакции с помощью веб-службы X? Прямо сейчас вы просто предполагаете, что это невозможно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.