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