Интеграция SQL Service Broker и NServiceBus

Мое требование состоит в том, что у меня есть "предметы" с разными состояниями. Мне нужно делать разные вещи в зависимости от состояния этих элементов (отправлять электронные письма, хранить файлы, обновлять внутренние приложения и т. д.). Проблема в том, что приложение, которое обновляет эти статусы, является сторонним, поэтому я не могу его обновить; усугубляет проблему тот факт, что только половина организации использует эту систему, а другая использует ее будущую замену. У меня есть открытый доступ к обеим используемым базам данных.

Мой план состоит в том, чтобы добавить сообщение в очередь SQL Service Broker с идентификатором и статусом с помощью триггера для каждого представления таблицы Item. Затем вызовите процедуру CLR из процедуры активации SSB, которая добавляет сообщение в очередь публикации через NServiceBus.

Казалось, все шло хорошо, пока я не попытался зарегистрировать свои сборки в SQL с помощью CREATE ASSEMBLY:

Msg 10327, Level 14, State 1, Line 1
Warning: The Microsoft .NET Framework assembly 'system.web, version=2.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a, processorarchitecture=x86.' you are registering is not fully tested in the SQL Server hosted environment and is not supported. In the future, if you upgrade or service this assembly or the .NET Framework, your CLR integration routine may stop working. Please refer SQL Server Books Online for more details.

etc. etc. etc.

CREATE ASSEMBLY for assembly 'System.Web' failed because assembly 'System.Web' is not authorized for PERMISSION_SET = UNSAFE.  The assembly is authorized when either of the following is true: the database owner (DBO) has UNSAFE ASSEMBLY permission and the database has the TRUSTWORTHY database property on; or the assembly is signed with a certificate or an asymmetric key that has a corresponding login with UNSAFE ASSEMBLY permission.
Msg 10301, Level 16, State 1, Line 2
Assembly 'log4net' references assembly 'system.web, version=2.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a.', which is not present in the current database. SQL Server attempted to locate and automatically load the referenced assembly from the same location where referring assembly came from, but that operation has failed (reason: 2(The system cannot find the file specified.)). Please load the referenced assembly into the current database and retry your request.
Msg 6218, Level 16, State 3, Line 3
CREATE ASSEMBLY for assembly 'NServiceBus.Core' failed because assembly 'NServiceBus.Core' failed verification. Check if the referenced assemblies are up-to-date and trusted (for external_access or unsafe) to execute in the database. CLR Verifier error messages if any will follow this message
Msg 6218, Level 16, State 3, Line 4
CREATE ASSEMBLY for assembly 'NServiceBus' failed because assembly 'NServiceBus' failed verification. Check if the referenced assemblies are up-to-date and trusted (for external_access or unsafe) to execute in the database. CLR Verifier error messages if any will follow this message

Во-первых, я хочу знать, является ли это совершенно безумной идеей. Я хочу, чтобы сообщения обрабатывались по порядку и добавлялись в очереди асинхронно. NServiceBus предоставляет хост-приложение, которое позволяет очень легко запускать новых издателей, когда это необходимо. Альтернативой, по-видимому, является написание службы Windows, которая отслеживает очередь SSB, а затем публикует. Просто хотелось бы мнений или советов. Спасибо.


person scottm    schedule 14.09.2011    source источник


Ответы (2)


Взгляните на транспорт SSB в NServiceBus-Contrib.

person Adam Fyles    schedule 14.09.2011
comment
Да, я посмотрел на это, но это зависит от 3.0.0.0, а на данный момент мне разрешено запускать только 2.6. - person scottm; 14.09.2011
comment
Существует версия, совместимая с 2.6: github.com/NServiceBus/NServiceBus-Contrib/tree /v2.5 - person Andreas Öhlund; 15.09.2011
comment
Похоже, репозиторий больше недоступен, но, похоже, есть клон: github.com/rmoritz/NServiceBus -Вклад - person Ramon Smits; 01.12.2015

Я бы, вероятно, выбрал модель опроса службы Windows. Даже несмотря на то, что это неинтересно и приводит к задержке, по крайней мере, вы можете сделать все красиво и транзакционно и можете обрабатывать сбои в хорошо понятном контейнере. Я не уверен, как sql-clr работает в условиях сбоя или в условиях большой нагрузки. Например, можно ли выйти из очереди сервис-брокера, а затем потерять сообщение?

Просто мои 2 цента

ИЗМЕНИТЬ

@Marco указал мне на следующий образец MS для получения сообщений SB в службу Windows: http://code.msdn.microsoft.com/Service-Broker-Message-e81c4316

person tom redfern    schedule 14.09.2011
comment
А NServiceBus не вносит туда задержки? - person MeTitus; 04.10.2013
comment
Не уверен, что вы имеете в виду, но нет, если только реализация NServiceBus для SQLSB не использует опрос под капотом. - person tom redfern; 04.10.2013
comment
В любом случае, я не так много знаю о SQLSB, но у меня сложилось впечатление, что единственный способ извлечь из него сообщения - это использовать пул (операторы SQL), в конце концов, это таблица на основе очереди, но я могу ошибаться. - person MeTitus; 04.10.2013
comment
Может есть другие способы. Если вы посмотрите на очереди базы данных Oracle (которые также являются просто таблицами), OTP.net предоставляет события, с которыми вы можете зарегистрировать обработчик. Таким образом, когда сообщение поступает в очередь оракула, срабатывает событие и выполняется обработчик. Это гораздо более приятное решение, и я надеюсь, что любая реализация будет делать что-то подобное. - person tom redfern; 04.10.2013
comment
Но события не появляются из ничего, если только не используется какой-либо COM-объект, возможно, с поддержкой обратных вызовов, в случае с SQL Server я не понимаю, как они могут использовать что-либо, кроме пула. - person MeTitus; 07.10.2013
comment
Без понятия. Если вас это беспокоит, git contrib и посмотрите! Я слишком ленив ;) - person tom redfern; 08.10.2013
comment
Не знаю, делает ли он пул под лесом, но похоже, что он использует какую-то подписку: code.msdn.microsoft.com/Service-Broker-Message-e81c4316 - person MeTitus; 11.10.2013
comment
Выглядит интересно, спасибо. Отредактировал мой ответ, чтобы включить. - person tom redfern; 11.10.2013
comment
Это действительно так. Не заморачиваться :) - person MeTitus; 11.10.2013