Может ли триггер SqlServer нажать на ActiveMQ

может ли кто-нибудь сказать мне, можно ли передавать данные из триггера SqlServer непосредственно в ActiveMQ.

Я просмотрел документы ActiveMQ и не вижу никаких ссылок на него. Мы можем использовать сервис, опрашивающий БД на наличие вставок, но триггер был бы идеальным решением.


person davemilligan    schedule 11.12.2012    source источник


Ответы (2)


но триггер был бы идеальным решением

Точно нет. Есть много причин, почему это плохая идея, но я приведу основные из них:

  • добавлена ​​задержка для каждого DML, так как вам нужно дождаться завершения вызова RPC.
  • операционные сбои со случайным и неустойчивым поведением, когда ActiveMQ имеет проблемы с доступностью (вызов RPC завершается сбоем, забирая с собой DML и исходную транзакцию приложения)
  • корректность при наличии откатов. Одно только это — полный стопор шоу. Вы не можете отменить операцию ActiveMQ, если транзакция приложения, запускающая триггер, откатывается по какой-либо причине.

Некоторые из них можно решить, зарегистрировав транзакцию приложения в распределенной транзакции (2PC) вместе с системой очередей, т.е. XA для ActiveMQ. Это решает последнюю проблему, но за счет серьезной задержки и снижения пропускной способности на порядки.

Рекомендуемое решение состоит в том, чтобы поставить триггер в очередь локально в таблице, используемой в качестве поставить в очередь и вывести внешнее приложение из очереди из этой таблицы и передать его в ActiveMQ. Не срезайте углы и не используйте состояние вашего приложения в качестве «очереди» (т. е. опрашивайте состояние и помечайте его как «обработанное»), вот почему 99% попыток «очереди в базе данных» терпят неудачу.

Вы по-прежнему не сможете решить некоторые проблемы, возникающие при разделении хранилища данных и хранилища очередей (невозможность последовательного резервного копирования/восстановления, «разделение мозгов» при аварийном переключении для HA/DR, как это делает организация очередей). не следовать аварийному переключению базы данных и т. д.), но их можно решить, только если вы купите очередь и обмен сообщениями, встроенные в базу данных, например Сервис-брокер.

person Remus Rusanu    schedule 11.12.2012

Я бы сказал, что можно создать UDF на сервере Sql, который запускает код в .NET и создает сервер ActiveMQ для соединения UDP/TCP.

Таким образом, я много работал с базой данных SqlServer, создавая неблокирующие соединения в локальной сети.

person Uriel Golab    schedule 04.03.2020