У одного из наших клиентов была похожая инфраструктура для связи между двумя разными системами.
Первый подход с использованием SQLCLR внутри триггера таблицы
Триггер в таблице вызывает процедуру SQLCLR, которая создает HTTPзапрос веб-API на публикацию данных.
Обнаружено проблем : поскольку это полная область транзакции, операции CRUD, инициированные внешним интерфейсом, начали ждать, пока сообщение не получитбыл опубликован SQLCLR.
Второй подход заключался в создании процедуры SQLCLR для реализации асинхронного HTTP-запроса
Создание процедуры SQLCLR в качестве асинхронного метода с использованием пространства имен потоков.
Обнаруженные проблемы : даже этот метод вызывал проблемы и терял сообщения, когда конечная точка была недоступна.
Третий подход с использованием SQL SERVICE BROKER в качестве оболочки вокруг SQLCLR
Реализован брокер SQL-сервера для разрыва транзакций между триггером и публикацией сообщений.И сделайте HTTP-запрос от целевой хранимой процедуры активации брокера SQL.Это решило проблему, так как разрывает транзакцию после добавления в очередь.
Преимущество с использованием компонента Service Broker в качестве оболочки для SQLCLR - вы можете прервать транзакцию и сообщенияхранятся в очереди и никогда не теряются; кроме того, мы можем использовать сервисный брокер для связи между двумя различными экземплярами SQL-сервера, если это необходимо.