Возможен ли NServiceBus (AsA_Server) без DTC? - PullRequest
6 голосов
/ 19 июля 2011

Я впервые использую NServiceBus и имею небольшое простое приложение, в котором пользователь отправляет форму, поля формы затем отправляются в очередь, а обработчик собирает эти данные и записывает их в базу данных, используя linq- к-SQL.

Любые изменения в службах компонентов полностью запрещены, если речь идет о администраторе БД, поэтому сейчас я ищу альтернативу DTC (которая не включена на сервере БД), но использую AsA_Server, чтобы сообщения не очищайся.

Я попытался удалить AsA_Server после IConfigureThisEndpoint и сам указать конфигурацию, но это не похоже на работу (консоль появляется, страница загружается, но ничего не происходит, она даже не останавливается на точках останова.) AsA_Client работает, но насколько я понимаю, сообщения будут удалены при запуске, которых мне нужно избегать.

Есть предложения?

Спасибо

ОМК

РЕДАКТИРОВАТЬ: теперь это было решено с помощью переноса вызова к базе данных в область действия подавляющей транзакции, что позволяет выполнять работу базы данных без внешней транзакции для зачисления в:

using (TransactionScope sc = new TransactionScope(TransactionScopeOption.Suppress)) 
{ 
     // code here 
     sc.Complete(); 
} 

Ответы [ 4 ]

9 голосов
/ 20 июля 2011

Когда вы используете AsA_Server, вы указываете, что хотите иметь длительные очереди, и вам нужно будет настроить транзакционные очереди.

При отправке / получении транзакций MSMQ требует, чтобы вы отправляли, передавали, получали и обрабатывали как часть одной транзакции.Однако на самом деле все эти этапы происходят в собственных транзакциях.

Например, транзакция отправки завершается, когда отправитель отправляет сообщение в свою локальную подсистему MSMQ (даже если адрес очереди удален, отправитель по-прежнему отправляет в локальную очередь, которая действует как прокси-сервер дляудаленная очередь).

Транзакция передачи завершается, когда подсистема MSMQ на машине отправителя успешно передает сообщение в подсистему MSMQ на машине получателя.

Несмотря на то, что все это может происходить на одном компьютере, я предполагаю, что ваш метод Handle () записывает данные в базу данных на другом компьютере.

Проблема здесь в том, что для удовлетворительного завершения операции приема с точки зрения транзакции ваш вызов в базу данных должен быть успешным.Только тогда сообщение будет удалено из очереди ввода.Это предотвращает любую вероятность потери сообщения во время сбоя обработки.

Однако, чтобы обеспечить это по всей сети, необходимо задействовать DTC для координации распределенной транзакции с базой данных.

Итог: если вы хотите иметь долговременные очереди в распределенной среде, вам нужно будет использовать MSDTC.

Надеюсь, это поможет.

7 голосов
/ 01 марта 2012

Есть альтернатива. В вашей строке подключения вы можете добавить опцию не подключаться к распределенной транзакции, и это приведет к игнорированию вашего соединения с БД в DTC.

Конечно, если это установлено в конфигурации, тогда все транзакции базы данных для приложения игнорируются DTC, а не только конкретной.

Пример:

<add key="DatabaseConnectionString" value="Data Source=SERVERNAME;Initial Catalog=DBNAME;Integrated Security=True;Enlist=False"/>
6 голосов
/ 28 октября 2013

С NServiceBus 4.0 теперь вы можете делать следующее, что в итоге сработало для меня:

 Configure.Transactions.Advanced(t =>
                {
                    t.DisableDistributedTransactions();
                    t.DoNotWrapHandlersExecutionInATransactionScope();
                });
5 голосов
/ 19 сентября 2011

Когда вы используете интерфейсы As (AsA_Client, AsA_Server), конфигурация применяется после Init (), поэтому все настройки, которые вы задаете для MsmqTransport и UnicastBus, переопределяются.

Возможно переопределить эти настройки, используя IWantTheConfiguration в реализации IHandleProfile. Вы получаете Конфигурацию после применения ролей по умолчанию, но до запуска шины.

Таким образом, вы можете изменить настройки профиля по умолчанию и адаптировать их к вашим потребностям: деактивировать транзакции, включить олицетворение ...

Пример:

public class DeactivateTransactions : IHandleProfile<Lite>, IWantTheEndpointConfig
{
    private IConfigureThisEndpoint configure;

    public IConfigureThisEndpoint Config
    {
        get { return configure; }
        set
        {
            this.configure = value;

            Configure.Instance.MsmqTransport()
                .PurgeOnStartup(false)
                .IsTransactional(false); // Or other changes
        }
    }

    public void ProfileActivated()
    {
    }
}
...