Место, где я работаю, - это попытаться установить некоторые основные правила, и сейчас мы ведем дебаты о том, что локальные библиотеки против веб-сервисов для повторного использования кода. Веб-сервисы, кажется, популярны в большинстве компаний, и именно к этому склоняется большинство разработчиков.
Я просто не понимаю, как можно эффективно использовать веб-сервисы для любой серьезной работы. Как я могу безопасно выполнить несколько вызовов службы, если я не могу использовать транзакцию?
Допустим, у меня есть работа cron, которая отбирает клиентов из нашей базы данных, которые удовлетворяют определенному условию, о котором они должны быть уведомлены. Им отправляется факс, электронное письмо, и создается билет для внутреннего отслеживания проблемы. Это 3 разных сервисных вызова, которые будут происходить для каждого клиента в цикле for.
Если где-то там происходит ошибка, возможно, что, например, факс и электронная почта отправлены клиенту, но билет не создан. Или, что еще хуже, это задание cron может содержать ошибку, из-за которой оно каждый раз приводит к сбою в одной и той же точке и постоянно отправляет электронное письмо одному и тому же клиенту. Если бы все библиотеки были локальными, все можно было просто обернуть в транзакцию, и ничего из этого не произошло бы. Но мы используем веб-сервисы в этом примере.
Обратите внимание, что методы электронной почты и факса фактически вставляют данные в таблицы очередей на основе базы данных, которые, в свою очередь, обрабатываются отдельным процессом задания cron. Таким образом, вызовы методов «отправить электронную почту» и «отправить факс» могут быть отменены без побочных эффектов, если это необходимо.
Один из вариантов - поместить весь этот кусок кода в сам веб-сервис, чтобы сам веб-сервис вызывал в транзакции методы создания электронной почты, факса и билетов. Но затем мы создаем метод веб-сервиса только для использования транзакции; нет никаких веских причин, по которым нам когда-либо нужно было бы вызывать этот метод из любой точки, кроме одного скрипта cron.
Как бы вы вообще справились с этим методом?
источник
Ответы:
На самом деле вы описываете распределенную транзакцию, реализующую двухфазную фиксацию . Некоторые корпоративные платформы обмена сообщениями включают в себя диспетчеры транзакций для поддержки такого рода вещей, но конкретные продукты зависят от платформы / языка. У меня нет конкретного опыта работы с такими инструментами, но надеюсь, что эти указатели помогут.
источник
Интересно, что, поскольку я участвую в этом конкретном вопросе и ответах, существует похожая тема об услугах, поддерживающих несколько платформ, в списке рассылки DDD / CQRS, в котором я участвую. Я могу повторить некоторые из моих советов здесь.
Одним из вариантов поддержки транзакций в гетерогенной среде является использование транспортного механизма, который поддерживает транзакции и поддерживается на всех платформах, с которых он будет использоваться. Advanced Message Queue Protocol (AMQP) делает поддержку транзакции и есть родная API для почти любого языка , который обычно используется сегодня. RabbitMQ - это сервер, который реализует AMQP и был проверен в отрасли как надежное решение.
Использование системы, основанной на RabbitMQ, позволит вам получить полноценный ESB, если вам понадобится развиваться. Вы публикуете сообщения на канал и подписываетесь на очередь. То, что становится действительно мощным, - это то, что между каналом и очередью вы можете выполнить много интересного. Канал может передавать несколько очередей (pub / sub), очередь может передаваться несколькими каналами, вы можете направлять сообщения в разные очереди в зависимости от содержимого и т. Д. И т. Д.
Я только что читал об альтернативах транзакциям (которые идут с накладными расходами и превращают асинхронную операцию в блокирующую операцию). RabbitMQ поддерживает так называемое подтверждение издателя . По сути, это позволяет зарегистрировать обратный вызов для опубликованного метода для обработки неудачной транзакции. В вашем случае это может отменить запросы электронной почты / факса и удалить билет.
Конечно, кроличья нора (простите за каламбур) идет еще глубже оттуда. Вы можете использовать Rabbit для создания сложных оркестровок как с внутренними, так и с внешними веб-сервисами.
Для ваших общедоступных веб-сервисов все становится просто. Ваша служба (будь то SOAP, REST или JSON) просто публикует сообщение в соответствующей очереди службы и позволяет внутренней системе обрабатывать его оттуда.
Также есть функциональность для создания сообщения запроса / ответа для тех сценариев, где вы ожидаете быстрого получения информации.
источник
Ключевые слова, которые вы ищете, - «хореография веб-сервисов».
Проверьте статью Wikipedia об этом.
источник
То, как я справился с этим в приложении-сервисе, которое я написал, заключалось в создании оболочки для обработки необходимых транзакций. В моем случае пользовательский запрос, сделанный веб-сайтом, настольным приложением или службой Windows, должен был запросить веб-службу и, в зависимости от результата и параметров пользователя, он должен был обновить локальную БД и, при необходимости, удаленную. через веб-сервис. Затем он должен был создать отчет, который должен быть немедленно возвращен, отправлен по электронной почте и / или отправлен по факсу. У меня был контроль над локальной базой данных, электронной почтой и генерацией отчетов, но я не управлял веб-службами или факс-сервером.
Создание оболочки позволило улучшить контроль транзакций и обработку ошибок. Это также позволило повысить безопасность, контролируя доступ к внутренним сетевым службам из внешних источников. В целом, я вижу необходимость в транзакциях и управлении службой в качестве веской причины для создания подходящей оболочки для одного решения, если код используется повторно должным образом (без кодирования «вырезать и вставить»).
источник
Ты не можешь
Вопрос, который вы должны задать: как мне реализовать транзакции с помощью веб-службы X? Прямо сейчас вы просто предполагаете, что это невозможно.
источник