Рекомендация по восстановлению оператора CRUD на связанном сервере в случае потери соединения

Я ищу наилучшую практику для следующего сценария.

В нашей компании есть CRM. Когда сотрудник обновляет запись о компании, срабатывает триггер, который запускает хранимую процедуру с оператором CRUD на связанный сервер, на котором размещена база данных SQL нашего веб-сайта.


Вопрос:

Что происходит, когда соединение теряется посреди CRUD, а база данных SQL веб-сайта не обновляется? Каким будет лучший способ снова обработать оператор SQL, когда соединение вернется?

Я читал о сервис-брокере или репликации транзакций. Является ли один из них более подходящим для этой ситуации?


Конфигурация:

Локальный: SQL Server 2008 R2

Сайт: SQL Server 2008.


person Greg    schedule 25.03.2015    source источник


Ответы (2)


Вот один из способов справиться с этим, предполагая, что оператор CRUD не является модальным, в том смысле, что вы должны дать ответ от связанного сервера пользователю, прежде чем что-либо еще может произойти:

Триггер хранит в локальной таблице всю метаинформацию, необходимую для запуска оператора CRUD на связанном сервере.

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

person Tab Alleman    schedule 25.03.2015
comment
Вкладка "Спасибо". Я рассматриваю это решение как потенциальный план C. C, потому что из того, что я читал о service broker и transactional replication, у них обоих есть какая-то встроенная очередь, задание, работающее в фоновом режиме и т. д. Потенциально, потому что я мало что об этом знаю и мой план С может превратиться в план А. - person Greg; 25.03.2015
comment
Будет ли это лучше, чем использование Service Broker, быстрее или безопаснее? - person Greg; 25.03.2015
comment
О, я совсем не знаком с Service Broker, поэтому не могу сказать. - person Tab Alleman; 25.03.2015

Если транзакция завершилась неудачно в середине триггера, она все еще будет в транзакции, и данные не будут записаны ни в базу данных CRM, ни в веб-базу данных. Существует также потенциальная проблема с производительностью: запрос на изменение данных SQL-сервера не вернет управление клиенту до тех пор, пока не будут завершены как локальное, так и удаленное изменение. Последнее не было бы проблемой, если бы запрос выполнялся асинхронно, но «выстрелил и забыл» — не лучший шаблон для записи данных.

Service Broker позволит вам записать модификацию в некоторые двоичные данные и позаботится о том, чтобы они были доставлены по порядку и должным образом обработаны на удаленном конце. Производительность не будет такой уж плохой, поскольку вставка в очередь предназначена для быстрого завершения, возвращая управление триггеру и позволяя завершить исходный запрос CRM.

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

Я использовал его в прошлом для создания системы обратного вызова с веб-сайта, клиент вводит свой номер на сайте и запрашивает обратный вызов, который отправляется через брокера услуг через VPN из Интернета на сервер бэк-офиса, и клиентское приложение ждет для вызова в очереди сервис-брокера. После установки работал очень эффективно.

person Stephen Turner    schedule 30.03.2015
comment
Спасибо webturner. Итак, если я правильно подытожу, Service Broker будет лучшим вариантом в целом, но его будет сложнее настроить? Последние несколько дней я пытался заставить его работать в нашей тестовой среде. Я только что получил его на работу. Мне сейчас предстоит попробовать с триггерами, SP и обновлениями, набитыми в него. Но пока кажется очень сильным. - person Greg; 30.03.2015
comment
Да все верно. Триггер должен просто вызвать вызов отправки с параметрами в данных. SP должен быть запущен с использованием активации сообщения для получения параметров. Вам также необходимо убедиться, что вы завершаете разговор с обеих сторон и имеете дело с отравленными сообщениями, то есть с теми, которые были повторены слишком много раз и были удалены из очереди, чтобы разблокировать их. - person Stephen Turner; 30.03.2015