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


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.