У нас есть приложение электронной коммерции .NET с серверной частью SQL Server 2005. Новый заказ требует определенной «постобработки». Эти задачи включают отправку электронной почты, создание файлов, загрузку файлов на FTP-сервер и выполнение операций CRUD для службы данных WCF. Код для выполнения всех этих задач уже существует в виде нескольких библиотек классов .NET.
В моей команде спор о том, где разместить этот код. Я написал простой сервис Windows, который регулярно опрашивает базу данных и, обнаруживая новые транзакции (на основе флагов) в базе данных, выполняет необходимые действия и регистрирует любые ошибки. Альтернативой, которая была предложена, является триггер SQLCLR INSERT, который запускает обработку.
Я знаю, что технически возможно выполнить многие (все?) Из вышеуказанных задач в SQLCLR - я даже нашел несколько статей, объясняющих, как использовать веб-сервисы из SQLCLR, так что, очевидно, люди делают это. Но я все еще колеблюсь. Был ли SQLCLR когда-либо предназначен для такого рода вещей? А если нет, что может быть практическим недостатком? Что касается потенциальных преимуществ триггера SQLCLR над службой Windows, я вижу только одно: меньше трафика в дБ. Первоначально мы ожидаем очень небольшой объем транзакций, поэтому служба Windows будет генерировать «расточительный» трафик. Но служба находится в том же окне, что и база данных, поэтому она даже не влияет на сеть, а только на внутренние ресурсы сервера.
Наконец, третья возможность - использовать триггер SQLCLR для сохранения простого токена в файловой системе и использовать FileSystemWatcher в службе Windows (вместо таймера) для выполнения задач по мере необходимости.
Пожалуйста, поделитесь своими мыслями о компромиссах этих различных подходов или предложите лучшую альтернативу.