В нашей организации у нас есть база данных SQL Server 2005 и множество клиентов баз данных: веб-сайты (php, zope, asp.net), богатые клиенты (legacy fox pro). Теперь нам нужно передать определенные события из базовой базы данных в другие системы (MongoDb, LDAP и другие). Парадигма сообщений кажется довольно способной решить эту проблему. Поэтому мы решили использовать брокер RabbitMQ в качестве промежуточного программного обеспечения.
Проблема потребления событий из базы данных сначала, казалось, имела только два возможных решения:
- Опросите базу данных для исходящих сообщений и передайте их брокеру сообщений.
- Использование триггеров в определенных таблицах для передачи сообщений брокеру на том же компьютере.
Мне не понравилась первая идея из-за проблем с задержкой, возникающих при периодическом выполнении sql.
Но основанный на событиях триггерный подход имеет проблему, которая кажется мне неразрешимой на данный момент. Рассмотрим этот сценарий:
- Строка вставляется в таблицу.
- Триггер запускает и отправляет сообщение (используя хранимую процедуру CLR, написанную на С#)
Все нормально, если транзакция, которая записывает данные, откатывается. В этом случае данные будут согласованы, но сообщение уже отправлено и не может быть отброшено, поскольку триггер срабатывает в момент записи в журнал базы данных, а не во время транзакционного фиксации (что является правильным поведением СУБД).
Теперь я понимаю, что я задаю слишком много триггеров, и они не подходят для задач, отличных от работы с данными.
Итак, мои вопросы:
- Кто-нибудь смог извлечь данные с помощью триггеров?
- Какие другие способы использования данных могут быть вам полезны?
- Является ли уведомление о запросе (построенном поверх Service Broker) подходящим в моей ситуации?
Спасибо заранее!