Место, где я работаю, - это попытаться установить некоторые основные правила, и сейчас мы ведем дебаты о том, что локальные библиотеки против веб-сервисов для повторного использования кода. Веб-сервисы, кажется, популярны в большинстве компаний, и именно к этому склоняется большинство разработчиков.
Я просто не понимаю, как можно эффективно использовать веб-сервисы для любой серьезной работы. Как я могу безопасно выполнить несколько вызовов службы, если я не могу использовать транзакцию?
Допустим, у меня есть работа cron, которая отбирает клиентов из нашей базы данных, которые удовлетворяют определенному условию, о котором они должны быть уведомлены. Им отправляется факс, электронное письмо, и создается билет для внутреннего отслеживания проблемы. Это 3 разных сервисных вызова, которые будут происходить для каждого клиента в цикле for.
Если где-то там происходит ошибка, возможно, что, например, факс и электронная почта отправлены клиенту, но билет не создан. Или, что еще хуже, это задание cron может содержать ошибку, из-за которой оно каждый раз приводит к сбою в одной и той же точке и постоянно отправляет электронное письмо одному и тому же клиенту. Если бы все библиотеки были локальными, все можно было просто обернуть в транзакцию, и ничего из этого не произошло бы. Но мы используем веб-сервисы в этом примере.
Обратите внимание, что методы электронной почты и факса фактически вставляют данные в таблицы очередей на основе базы данных, которые, в свою очередь, обрабатываются отдельным процессом задания cron. Таким образом, вызовы методов «отправить электронную почту» и «отправить факс» могут быть отменены без побочных эффектов, если это необходимо.
Один из вариантов - поместить весь этот кусок кода в сам веб-сервис, чтобы сам веб-сервис вызывал в транзакции методы создания электронной почты, факса и билетов. Но затем мы создаем метод веб-сервиса только для использования транзакции; нет никаких веских причин, по которым нам когда-либо нужно было бы вызывать этот метод из любой точки, кроме одного скрипта cron.
Как бы вы вообще справились с этим методом?